这是我猜的两个问题。
我们开发了一个访问Oracle数据库的.Net应用程序,并注意到在更改了用户的Oracle密码后,应用程序继续使用连接中的旧密码短时间工作串。据推测,这与现有连接的汇总方式有关?
首次调查时,我们尝试关闭连接字符串中的池,但是应用程序无法正常工作,抛出错误"无法在分布式事务中登记"在它尝试打开连接的点上。虽然我们可能不想在生产应用中关闭连接池,但我很好奇为什么MSDTC似乎需要它?
我们正在使用Oracle 11g(11.1.2)和最新的ODP.Net(我认为是11.2)。
提前致谢
安迪
答案 0 :(得分:4)
请参阅下面的一些调查结果:
问题一:(应用程序仍与旧的DB密码连接)
如果我们使用连接池选项连接数据库,连接池管理器将在首次调用open
或close
OracleConnection
对象时创建并维护连接会话数。 (此连接会话的数量取决于连接字符串中的“min”和“max”池大小)。在Oracle中,我认为您可以检查活动会话,如:
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
根据Oracle doc,此连接池服务将在处于活动状态3分钟后关闭连接会话。 [http://docs.oracle.com/html/E10927_01/featConnecting.htm]
问题二:(为什么MSDTC需要)
如果您在代码中使用嵌套数据库连接,它将被提升为DTC。 [http://petermeinl.wordpress.com/2011/03/13/avoiding-unwanted-escalation-to-distributed-transactions/]实际上,Oracle Service for Microsoft Transaction Server(OraMTS)在ODP.net,DTC和Oracle数据库中起作用。
但是在禁用连接池之前,您没有遇到此问题(MSDTC)。看起来您的代码正在从取消连接池中重用相同的连接,并且可能无需提升DTC。在StaffOverflow上有类似的问题。 [Why isn't my transaction escalating to DTC?]