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

相关问题