2013-09-24 72 views
0

我們在這裏有一個應用程序,它使用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版。

非常感謝

回答

0

據我所知,你需要兩個OCI_EVENTS + OCI_THREADED屬性集,在這種配置中創建您的環境。

舉例來說,這裏是它是如何在我們的Open Source direct Oracle access unit初始化:

fEnvironmentInitializationMode := OCI_EVENTS or OCI_THREADED; 
    ... 
    with OCI do 
    try 
    if fEnv=nil then 
     // will use UTF-8 encoding by default, in a multi-threaded context 
     // OCI_EVENTS is needed to support Oracle RAC Connection Load Balancing 
     EnvNlsCreate(fEnv,Props.EnvironmentInitializationMode, 
     nil,nil,nil,nil,0,nil,OCI_UTF8,OCI_UTF8); 

我懷疑你必須檢查你的OCI環境是如何在ODAC創建。

+0

非常感謝Arnaud,但我剛剛檢查了ODAC源,並且正如您所說,已經使用'OCI_EVENTS + OCI_THREADED'創建了環境。 – zedmartins

+0

@zedmartins太糟糕了! :(你的代碼中每個線程是否有一個連接? –

+0

每個線程在datamodule激活事件上打開一個新的數據庫連接。 – zedmartins