1

我正在使用Dapper和Quartz.Net(調度程序)的組合來將簡單對象的信息保存到11gR2數據庫(Quartz is self contained並自行打開和關閉連接,Dapper調用通過由也控制事務的工作單元維護的連接來執行過程)。嘗試在TransactionScope的上下文中打開多個Oracle連接導致ORA-12514

我正在使用Microsoft批准的TransactionScope方法來初始化一個事務,並將連接設置爲在已經運行的分佈式事務中自動登記。 我爲12c使用託管Oracle驅動程序,因此沒有安裝12c客戶端。

這是奇怪的。第一次連接總是打開成功,並獲得加入交易,無論採用哪種方式。 第二個總是失敗,並拋出一個ORA-12514錯誤。

 
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor ---> OracleInternal.Network.NetworkException (0x000030E2): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 
    at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor) 
    at OracleInternal.Network.OracleCommunication.Connect(String tnsDescriptor, Boolean externalAuth, String instanceName) 
    at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, String instanceName) 
    at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch) 
    at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch) 
    at OracleInternal.ConnectionPool.PoolManager`3.GetEnlisted(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp) 
    at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword) 
    at Oracle.ManagedDataAccess.Client.OracleConnection.Open() 

我懷疑這是與底層的連接問題,因爲如果我刪除了交易範圍,只是運行保存操作作爲兩個單獨的呼叫,一切工作正常。 下面是我正在做的一個簡單的例子,修剪和匿名。

using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions {IsolationLevel = isolationLevel}) 
{ 
    connection.Open(); // works, BUT if I move this line under the next one, the calendar save will succeed and this will fail. 
    quartzScheduler.AddCalendar(calendar.Name, c1, true, true); // calls underlying Quartz class that opens a connection, saves to the db and closes a connection - *** this line will fail *** 
    _repository.Save(_connection); 
} 

MS DTC服務正在本地運行(Windows 7),Oracle MTS恢復服務(用於11客戶端)已安裝並且正在運行。

我閱讀了Oracle驅動程序附帶的幫助,並按照建議在項目的x86和x64文件夾中添加了64位和32位驅動程序,並設置爲始終作爲構建的一部分進行復制;但我不認爲我甚至得到這麼多 - 這就像第二個連接總是失敗,我無法確定爲什麼。

我已經沒有想法了,在您保存到特定模式和數據庫之外時,此區域的幫助似乎相當稀疏​​。

歡迎所有的想法,在此先感謝!

其他編輯

今天早上,我還嘗試了簡單的測試,由事務範圍內打開兩個連接,以促進標準的交易。 出現同樣的問題:

using (var ts = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions {IsolationLevel = IsolationLevel.ReadCommitted}, EnterpriseServicesInteropOption.Full)) { 
    var currentTransaction = Transaction.Current; 
    var identifier = currentTransaction.TransactionInformation.DistributedIdentifier; 
    using (var oc1 = new CustomOracleConnection(_connectionString, 50, 50)) { 
     oc1.Open(); 
     using (var oc2 = new CustomOracleConnection(_quartzString, 50, 50)) { 
     oc2.Open(); 
     } 
    } 
} 

望着跟蹤信息,然後我想知道這是什麼做統籌。 我試圖在事務範圍外首先打開第二個連接,然後再試一次。這工作....所以它看起來像問題是,Oracle驅動程序有一個錯誤,當試圖打開不在池中的第二個連接?

回答

2

在諮詢過Oracle之後,我瞭解到:
a)這是Oracle驅動程序公認的錯誤,並已在其代碼庫中修復,但不太可能使第4版發佈,因此它可能是而之前我們在版本5中看到它。
b)臨時解決方法是在連接到數據庫時使用SERVICE_NAME而不是SID。

有關詳情請參閱Oracle ODP.Net論壇 https://community.oracle.com/message/13275819

+0

喜,@burgen。你知道現在是否已經發布了這個版本嗎?我專門查看了發行說明和錯誤修復,並沒有看到這一點。我正在使用12.1.24160419,並且在Quartz.net中間歇性地看到了這個問題。 –

+0

嗨@IgorPashchuk不幸的是我不知道,自從我最初向Oracle提出這個問題之後已經有一段時間了,但是您可以嘗試回覆我的原始ODP.Net論壇主題,看看您是否收到回覆 - 請告訴我們! – burgen

相關問題