2013-12-11 58 views
0

使用Oracle的ODP.NET库,我正在处理的应用程序需要执行两种不同类型的查询,其中一种类型可能相对较慢,但另一种类型的查询速度要快。我继承的当前应用程序代码完全禁用连接池,并为“快速”查询保留特定的连接对象,这对于此目的非常有用,因为如果第一次调用的时间超过X毫秒,我们就可以切换到另一个打开的连接,提醒用户如果第二次通话不够快,数据没有足够快地返回。单个连接的ODP.NET连接池关闭?

与此同时,更改连接字符串以启用池化操作后,我们运行的常规查询返回的速度要快得多,因此使用池化查询会更好。

有没有一种方法可以为大多数目的启用池,但禁用它的特定连接对象?或者它会更容易一些(因为我们已经有了基本的代码来为关键查询“汇集”两个连接)来扩展现有的代码,以通过一般查询的连接对象的小集合进行轮换,并保持两个其他连接分开对于更关键的查询?

+0

我认为你并不是想通过烟雾来取代火焰。在连接对象之间切换会导致代码难以理解,并且该解决方案会增加代码的复杂性(维护这些连接)。在一个项目中,我们发现计算执行计划花了很长时间,我们认为应该将这些执行计划存储到数据库中,几周后我们意识到左外连接是慢查询和消除这些问题的真正原因。 – Mino

+0

现有的代码在任务内部运行查询,因此使用不同的连接运行另一个任务很容易通过简短的'//过了很长时间,再次尝试不同的连接'来解释。就实际查询而言,我无法以任何方式对其进行优化,幸运的是,它通常返回的速度比我们的阈值快大约10倍。如果没有,我们使用新连接从群集中获取响应相同TNS名称的空闲服务器(根据DBA强大的“建议”),这通常可以解决问题。 – Amazingant

+0

您是否检查过此网站? http://www.oracle.com/technetwork/issue-archive/2006/06-jul/o46odp-097508。html – Mino

回答

1

在链接到here文章@Mino,它指出:

如果在连接字符串参数中的任何一个被修改,ODP.NET将创建一个新的连接池为您的应用程序下一次连接请求。

扩展和基于从Visual Studio的调试器和拆卸工具JustDecompile信息澄清声明,我相信:

  • 目前ODP.NET连接器创建一个新的连接池的任何时间连接字符串中的任何内容都会发生变化,甚至延伸到在字符串的不重要部分添加或删除空白字符
  • 即使在该服务器的存在池的情况下,也可以在不使用连接缓冲池的情况下创建关闭缓冲池的任何连接。
  • 而且,使用已有连接池的连接字符串打开的任何新连接都将继续使用旧池。

Oracle的连接池真的足够聪明,可以做我想做的事。所有这些都使用Oracle.ManagedDataAccess.dll v4.121.1.0作为Oracle.com的ODAC 12.1.0.1.0 with Oracle Developer Tools for Visual Studio包的一部分进行了调查。