Oracle ODP.Net和连接池

时间:2012-02-03 15:25:24

标签: connection-pooling odp.net

这是我猜的两个问题。

我们开发了一个访问Oracle数据库的.Net应用程序,并注意到在更改了用户的Oracle密码后,应用程序继续使用连接中的旧密码短时间工作串。据推测,这与现有连接的汇总方式有关?

首次调查时,我们尝试关闭连接字符串中的池,但是应用程序无法正常工作,抛出错误"无法在分布式事务中登记"在它尝试打开连接的点上。虽然我们可能不想在生产应用中关闭连接池,但我很好奇为什么MSDTC似乎需要它?

我们正在使用Oracle 11g(11.1.2)和最新的ODP.Net(我认为是11.2)。

提前致谢

安迪

1 个答案:

答案 0 :(得分:4)

请参阅下面的一些调查结果:

问题一:(应用程序仍与旧的DB密码连接)

如果我们使用连接池选项连接数据库,连接池管理器将在首次调用openclose 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]

  1. 所以最可能的原因是,您的申请仍然存在     使用此池连接到数据库并仍然连接     很短的时间,即使您更改了数据库密码。
  2. “Oracle客户端缓存”还有一种可能性     ODP.net中的功能。但不太确定,你可以查看,[     http://www.oracle.com/technetwork/issue-archive/2008/08-jul/o48odpnet-098170.html]
  3. 问题二:(为什么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?]