2017-01-06 134 views
1

我在不同方法中使用多個連接,但是當我關閉連接時,連接會話在數據庫會話中掛起爲非活動狀態,直到我終止.exe文件。我使用的連接使用的語句,如:C#WinForm Oracle會話在連接關閉後掛起

using(OracleConnection con = new OracleConnection(constring)) 
{ 
con.Open(); 
} 

而且我還試圖關閉和手動處置連接,並使用OracleConnection.ClearPool(CON)OracleConnection.ClearAllPools()但他們都不作品。

使用參考IM: System.Data.OracleClient的版本2.0.0.0

連接字符串 數據源= IP /分貝;用戶ID =用戶;密碼= PW;

+0

這不是一個真正的答案,但我們最近有一個非常類似的問題。其他開發者之一已將此添加到我們的連接字符串中,並且事情似乎有所改進。我絕不是這方面的專家,但它也可以幫助你。 「Min Pool Size = 0; Max Pool Size = 16; Incr Pool Size = 2; Decr Pool Size = 1; Validate Connection = False; Connection Lifetime = 0;」只需將其添加到連接字符串中,然後看看它是如何發生的。 – BigTallJosh

+0

Incr池大小,Decr池大小和驗證連接不支持的關鍵字:( – trksyln

+0

我的錯誤我錯過了,你仍然在使用System.Data.OracleClient,現在已經廢棄了,你是否嘗試過使用新的ODAC適配器? www.oracle.com/technetwork/topics/dotnet/downloads/net-downloads-160392.html – BigTallJosh

回答

1

這種行爲是正常現象,因爲如果您使用Dispose();連接,來自Oracle的ConnectionPool並不會真正銷燬連接,而是將狀態設置爲「空閒」。所以下次你打開一個連接時,你並沒有真正打開一個新的連接,你只需在你的ConnectionPool中查找一個'free'連接並使用它。如果不存在空閒連接,則會創建一個新連接。

此行爲可以讓您獲得更好的性能,因爲打開/關閉連接成本低廉。

如果你使用:

using(OracleConnection con = new OracleConnection(constring)) 
{ 
} 

con.Close(); 

這是一樣的,你用Dispose();。只需確保在使用塊的末尾調用Dispose。這就是爲什麼只使用實現IDisposable的對象的原因。

到目前爲止確定...但爲什麼OracleConnection.ClearAllPools()關閉連接?它的確如此,但Oracle直接創建一個新的Connection,以便您的ConnectionPool被填充到MinPool-Size。這就是爲什麼BigTallJosh代碼:

「閔池大小= 0;最大池大小= 16;增量池大小= 2; DECR游泳池 大小= 1;驗證連接= FALSE;連接生存期= 0;

停止這種行爲。0 A起價池大小將停止自動創建新的連接。

Here你可以找到關於ClearAllPools();方法一個很好的解釋。

這樣才能最終回答你的問題。設置MinPoolSize=0,然後呼叫connection.ClearAllPools();。這應該工作。

+0

** Clearpool()**和** Clearpools()**在使用** Oracle.DataAccess 2.102更改當前引用後工作。 2.20 **,但現在我將在一些電腦上有一些oracle客戶端問題:(thx爲您的努力 – trksyln

+0

@trksyln您的歡迎。有趣的是,這個版本有問題 – Sebi

+0

感謝您的解釋,我沒有真正瞭解我們的其他開發人員爲了讓我們更好,但這很清楚地解釋了它! +1 – BigTallJosh