2013-08-16 15 views
0

我們有一個使用WCF開發的3層應用程序。我們的Web層[32位Windows 2003 Sp1]調用與Oracle 10g DB [64位Linux]進行通信的WCF服務[NLB上的64位Windows 2008 R2]。數據庫連接使用Nhibernate 2.2建立。 WCF通信使用BasicHTTPBinding。使用Nhibernate + Oracle的WCF無法間歇性地連接數據庫

在32位測試環境應用程序運行良好,但在上面指定的Live環境中,我們遇到崩潰。具體根據記錄的重複誤差,

System.ApplicationException:>內部異常是

NHibernate.ADOException:當準備選擇stderrorme0_.ERR_NO如 ERR1_10_,stderrorme0_.ERR_TYPE如ERR2_10_,... ....,從 STD_ERROR_MESSAGE stderrorme0_ where stderrorme0_.ERR_NO =:p0發生錯誤 ---> System.InvalidOperationException:Timeout過期。在從池中獲取連接之前已經超時了 。 可能發生這種情況的原因是,所有連接的池都在使用中,並且達到最大池大小。

此錯誤重複,只是表被提取的表更改。

臨時解決方案:重新啓動IIS中託管的WCF服務。

請幫助我們解決您的建議和解決方案。這篇文章是在各種博客之後進行如此多的試驗和錯誤之後提出的。

+1

最可疑的是* not *關閉連接和/或* not *事務請參閱http://stackoverflow.com/q/1642252/1679310 –

回答

0

這幾乎可以肯定是因爲連接沒有正確處理(https://stackoverflow.com/a/5442062/221708),在你的情況下可能是由於不正確地處置NHibernate會話造成的。就像你應該在using塊中封裝連接一樣,你應該將塊中的NHibernate會話包裝起來。

這裏有一些好文章對WCF管理NHibernate的會議:

還要記住,如果你使用的是sessionFactory.OpenSession(IDbConnection)超載,你有責任關閉由session.Close()返回的連接。

+0

感謝Daniel,我們肯定會檢查我們的nHib環境中是否存在此類未處理對象。但令我們困惑的是,該應用程序在我們所有的測試環境中都能正常工作。只有在Live環境中部署時,我們纔有這樣的問題。所以我有一個疑問是,任何數據庫配置或權限是否可以導致這個..? –

+0

也許現場環境獲得更多流量,這意味着更多的連接到數據庫?也許測試環境更頻繁地部署,意味着更頻繁的WCF重啓?這肯定是WCF服務不釋放數據庫連接的問題,因爲重新啓動它可以解決問題一段時間。 –