記錄關於使用ADO.NET 連接池連接Oracle時Session信息不更新的坑

来源:http://www.cnblogs.com/wuwenmao/archive/2016/08/09/5754574.html
-Advertisement-
Play Games

最近的一個項目中,由於界面查詢的數據量比較大,關聯的表比較多,有些數據查出來需要臨時保存起來供後面的查詢使用,於是想到了用oracle的臨時表來實現這個需求。大家都知道,oracle的臨時表有兩種:事務級別臨時表和會話級別臨時表,我這裡使用的是會話級別的臨時表。當時把功能時候後就以為萬事大吉了,沒想 ...


      最近的一個項目中,由於界面查詢的數據量比較大,關聯的表比較多,有些數據查出來需要臨時保存起來供後面的查詢使用,於是想到了用oracle的臨時表來實現這個需求。大家都知道,oracle的臨時表有兩種:事務級別臨時表和會話級別臨時表,我這裡使用的是會話級別的臨時表。當時把功能時候後就以為萬事大吉了,沒想到就在這裡買下了一個坑。

      坑的浮現:之後在為系統加調試日誌時偶然發現了臨時表的數據沒有像oracle臨時表的定義那樣“不同會話獨享臨時表,臨時表的數據在會話結束後被自動清空”。首先看第一次查詢的日誌記錄截圖,第一次的查詢數據量是10017行,紅色框圈住的地方使用到臨時表:   第二次查詢的日誌記錄截圖,第二次查詢的數據量比第一次少,15行:        從這前後兩次的查詢結果來看,得到的結論是:使用到的oracle會話級別臨時表沒有像它定義那樣,在會話結束後沒有把臨時表的數據清空?不過很明顯不是因為這個原因了,最有可能的就是原因應該是,前後兩次查詢都是同一個Session,所以才導致臨時表的數據沒有被清空了。有了這個思路,接下來就是找到為什麼前後兩次的查詢會是同一個Session。  追究坑出現的原因: 首先,系統環境: 1、使用的ADO.NET是預設啟用了連接池,連接池配置使用預設的配置; 2、連接oracle資料庫的驅動是: 3、每次查詢都是新建一個Connection,然後都是在查詢完後調用Close()、Dispose();   查找坑出現的思路: 1、啟用連接池後,前後兩次查詢使用的連接都是同一個連接; 2、查詢完畢後,Connection調用Close()、Dispose()方法後並沒有真正關閉Session; 驗證過程: 首先看看oracle官方文檔對Connection Pool的解釋: With connection pooling enabled (the default), the Open and Close methods of the OracleConnection object implicitly use the connection pooling service. In the preceding code, the Open call uses the connection pooling service, which is responsible for returning a connection to the application.   Connection pools are created by the connection pooling service using the ConnectionString as a signature to uniquely identify a pool.   If no pool with the exact attribute values in the ConnectionString exists, the connection pooling service creates a new connection pool. If a pool already exists with the requested signature, a connection is returned to the application from that pool.   When a connection pool is created, the connection-pooling service initially creates the number of connections defined by the Min Pool Size attribute of the ConnectionString. This number of connections is always maintained by the connection pooling service for the connection pool.   At any given time, these connections are available in the pool or used by the application.   The Incr Pool Size attribute of the ConnectionString defines the number of new connections to be created by the connection pooling service when more connections are needed in the connection pool.   When the application closes a connection, the connection pooling service determines whether the connection lifetime has exceeded the Connection Lifetime attribute; if so, the connection pooling service closes the connection; otherwise, the connection goes back to the connection pool. The connection pooling service only enforces the Connection Lifetime when a connection is going back to the connection pool.   The Max Pool Size attribute of the ConnectionString sets the maximum number of connections for a connection pool. If a new connection is requested, no connections are available, and Max Pool Size has been reached, then the connection pooling service waits for the time defined by Connection Timeout. If the Connection Timeout has been reached and there are still no connections available in the pool, the connection pooling service raises an exception indicating that the pooled connection request has timed-out.   The connection pooling service closes connections when they are not used; connections are closed every three minutes. The Decr Pool Size attribute of the ConnectionString provides connection pooling service for the maximum number of connections that can be closed in one run.   Connection調用Open()方法時,以下是oracle官方文檔描述: The connection is obtained from the pool if connection pooling is enabled. Otherwise, a new connection is established. It is possible that the pool does not contain any unused connections when the Open() method is invoked. In this case, a new connection is established. Connection調用Close()方法時,以下是oracle官方文檔描述: Rolls back any pending transactions.
Places the connection to the connection pool if connection pooling is enabled. Even if connection pooling is enabled, the connection can be closed if it exceeds the connection lifetime specified in the connection string. If connection pooling is disabled, the connection is closed.
Closes the connection to the database.

The connection can be reopened using Open().

從oracle官方文檔對於Connection Pool和Connection的Open、Close方法的描述和結合當前系統環境(查詢請求只有一個客戶端)來看,我們不難可以得到這麼一個場景:第一次查詢的時候,Connection Pool創建了一個連接返回給Connection對象,查詢完後返回給連接池;在第二次查詢時,由於跟第一次查詢時間間隔小於預設的Connection LifeTime,Connection Pool就返回了第一次查詢所用的連接給Connection對象用於查詢,結果第一次和第二次用的連接都是同一個。再有,由Close()方法的描述來看,Connection調用Close方法時,並沒有把連接的Session信息等數據清除掉(只有在連接真正從連接池移除掉之後,Session才沒有)。   目前想到的解決辦法有兩個(最終決定使用第一個): 1、在每次使用臨時表之前先truncate一下臨時表; 2、不使用Connection Pool;         第一次發文,主要是今天看了博主農碼一生的博文《我們為什麼應該堅持寫博客》,然後順便記錄一下這個坑,請教園中各位前輩,有沒有其他解決方法,或者是說,我解決問題的方向錯了。請多多指教~~~                   
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 面向對象的編程區別於面向過程的編程,其操作的單元是類,而面向過程操作的單元是方法。即面向過程的編程是由一個又一個的方法組成的。而面向對象的編程是由一個又一個類組成的。相對於面向過程,面向對象的代碼復用性更好,代碼的隱蔽性更高,並且更加符合人類思維的方式。 ...
  • 最前面的話:Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • 1.面向對象的3大屬性,封裝、繼承、多態,以一個加單的電腦為例: 創建一個父類Operation 有兩個屬性 和一個計算方法(虛方法),便於子類重寫: 1 public class Operation 2 { 3 private double _numberA = 0; 4 private dou ...
  • 第一種方式:submit 按鈕 提交 第二種方式: $("#dataform").ajaxSubmit() 提交 第三種方式:post 提交 ...
  • 通常,應用程式可以將那些頻繁訪問的數據,以及那些需要大量處理時間來創建的數據存儲在記憶體中,從而提高性能。基於微軟的企業庫,我們的快速創建一個緩存的實現。 新建PrismSample.Infrastructure.Cache 新建一個類庫項目,將其命名為PrismSample.Infrastructu ...
  • 迭代器也是C# 2.0的產物。 1.1 迭代器的簡介 迭代器記錄了集合中的某個位置,它使程式只能向前移動。C# 1.0中使用foreach語句來實現訪問迭代器的內置支持,foreach使遍歷集合變得簡單,它比for語句更方便,也更容易理解。foreach被編譯器編譯後,會調用GetEnumerato ...
  • 上一章博客我為大家介紹了Process類的所有基本使用方法,這一章博客我來為大家做一個小擴展,來熟悉一下Process類的實際使用,廢話不多說我們開始演示。 先看看我們的軟體要設計成的佈局吧。 首先我們需要給定會使用到的dll,記得vs中的引用那一項嗎?我們雖然不需要將這裡面的引用全部導入進來,但是 ...
  • 爬蟲和轉載請註明原文地址;博客園蝸牛:http://www.cnblogs.com/tdws/p/5754706.html Redis的持久化過程中並不需要我們開發人員過多的參與,我們要做的是什麼呢?除了深入瞭解RDB和AOF的作用原理,剩下的就是根據實際情況來制定合適的策略了,再複雜一點,也就是定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...