ODP.NET连接池:如何判断是否已使用连接

时间:2011-10-21 06:06:05

标签: c# oracle connection-pooling odp.net

我正在修改Winforms应用程序以使用连接池,因此可以在后台线程中进行数据访问。业务逻辑在PL / SQL中实现,并且为了利用业务逻辑,必须调用几个与安全相关的存储过程。

我需要的是一种判断连接是否在没有往返数据库的情况下使用的方法。我不认为我可以在HashSet中跟踪它们,因为我怀疑Equals甚至ReferenceEquals是否可以依赖。有什么想法吗?

修改

为了清楚起见,我计划使用ODP.NET的内置连接池机制。如果我滚动自己的连接池,跟踪哪些连接是新的与使用的连接将是非常微不足道的。

3 个答案:

答案 0 :(得分:3)

ODP.NET提供的连接池完全不透明。也就是说,它不会像我希望的那样泄漏 - 无法知道之前是否使用过连接或者是全新的。然而,它是另一种方式的漏洞抽象:在连接的用法之间保留任何会话状态(例如,包括作用域范围的变量)。由于这是一个关于确定连接的使用与新状态而不去数据库的问题,答案是它无法使用ODP.NET的内置连接池完成。

这留下两个选择:

  1. 创建连接池实现,该实现在创建每个新连接时提供该信息或执行用户定义的初始化;或
  2. 执行数据库往返,以确定连接的已使用状态与新状态。

答案 1 :(得分:0)

ADO.NET为您管理连接池。它甚至可以配置。为什么你自己会尝试跟踪这些连接?

http://msdn.microsoft.com/en-us/library/bb399543.aspx

而且,特别是对于Oracle:

http://msdn.microsoft.com/en-us/library/ms254502.aspx

  

适用于Oracle的.NET Framework数据提供程序提供连接   自动为您的ADO.NET客户端应用程序汇集。您可以   还提供多个连接字符串修饰符来控制连接   池化行为(请参阅“使用连接控制连接池”   字符串关键字,“本主题后面部分。”

     

池创建和分配

     

打开连接时,会根据a创建连接池   将池与连接相关联的精确匹配算法   连接中的字符串。每个连接池都与a关联   不同的连接字符串打开新连接时,如果是   连接字符串与现有池(新池)不完全匹配   池已创建。

     

创建后,连接池在活动之前不会被销毁   过程结束。维护非活动池或空池只使用很少的系统   资源。

顺便说一句,我想我对所有正在进行的OracleClient更改并不完全苛刻。似乎微软可能会放弃支持?最后我知道ODP.NET是基于ADO.NET的...但是,即使我弄错了,ODB.NET也声称支持连接池开箱即用:

http://download.oracle.com/docs/html/E10927_01/featConnecting.htm#CJAFIDDC

答案 2 :(得分:0)

如果你需要的只是知道你是否有一些连接不是来自池而是一个全新的连接,我认为你可以使用ODP.NET提供的HardConnectsPerSecond和SoftconnectsPerSecond性能计数器。

但这并不能确切地告诉您哪个OracleConnection.Open()会导致硬连接。我还在考虑组合其他ODP.NET perf计数器以确定是否创建了新的硬连接,但经过一些实验后这并不容易,因为ODP.NET也会每三分钟清除一次连接(取决于Decr Pool Size设置)