我們在這裏有一個應用程序,它使用COM + dll內的ODAC組件連接到Oracle Server 11g。OCISessionBegin掛在多線程COM +應用程序中[Delphi + ODAC + Oracle]
最近我們遇到了一個問題,就是我們找不到解決方案。
由於某些原因,當某些客戶端的應用程序服務器併發性過高時,一些dll開始掛起,他們必須終止進程以恢復產品的可用性。爲了在我們的辦公室重現錯誤,我們創建了一個測試環境來強調應用程序服務器。我們啓動30-50個程序調用應用程序,並在一段時間後出現問題。
在服務器掛起後調試我們的DLL,顯示任何後續的對OCISessionBegin的調用都無法完成。沒有錯誤產生。沒有其他症狀可見。
我們嘗試執行的最後一行是:Check(OCISessionBegin(...));在OraClasses.pas
我們檢查數據庫沒有爭用,沒有鎖。
我們在客戶端使用ODAC 6,但我們將其升級到最新版本,問題依然存在。我們必須使用Oracle客戶端10連接到數據庫11g,因爲它們正在使用ODAC的第6版。
非常感謝
非常感謝Arnaud,但我剛剛檢查了ODAC源,並且正如您所說,已經使用'OCI_EVENTS + OCI_THREADED'創建了環境。 – zedmartins
@zedmartins太糟糕了! :(你的代碼中每個線程是否有一個連接? –
每個線程在datamodule激活事件上打開一個新的數據庫連接。 – zedmartins