2012-02-03 66 views
4

这真是一个我想两个问题。甲骨文ODP.Net和连接池

我们开发了访问Oracle数据库的.Net应用程序,并已经注意到,改变了用户的Oracle口令后,应用程序继续短时间使用旧密码连接字符串中工作。想必这是与现有连接汇集的方式有关吗?

第一次调查时,我们尝试关闭连接字符串中的连接池,但应用程序无法正常工作,并在尝试打开连接时抛出错误“无法登记到分布式事务中”。虽然我们可能不想关闭生产应用程序中的连接池,但我很好奇MSDTC为何需要它?

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

在此先感谢

安迪

回答

4

请参阅下面的一些发现的:

对于问题一:(应用程序与旧的数据库密码仍然连接)

如果我们使用连接池选项连接数据库,连接池管理器会创建并维护连接数sessi首先调用opencloseOracleConnection对象。 (号此连接会话的依赖于“MIN” &“最大”池大小的连接字符串)。在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'; 

而根据甲骨文的文档,这个连接池服务将在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]

对于问题二:(为什么MSDTC需要)

如果您使用的是你的代码嵌套的数据库连接,这将提升到DTC。 [http://petermeinl.wordpress.com/2011/03/13/avoiding-unwanted-escalation-to-distributed-transactions/]实际上,Oracle Transaction for Microsoft Transaction Server(OraMTS)充当ODP.net,DTC和Oracle数据库。

但是你没有happend这个问题(MSDTC)禁用前的连接池。看起来您的代码正在重新使用连接池中的同一连接,并且可能无需升级DTC。 StaffOverflow上也有类似的问题。 [Why isn't my transaction escalating to DTC?]