Oracle OLEDB连接池和无效连接

4
我们正在使用ADO访问Oracle 10g release 2,Oledb提供程序用于Oracle 10g。我们在连接池方面遇到了一些问题。数据库驻留在远程计算机上,连接池按照应有的方式发生。但是,如果远程计算机由于某种原因关闭,连接将从池中返回,并且在该连接上的查询将失败。当此连接关闭时,它会被返回到池中而不是无效。随后的连接打开请求成功,但查询失败。根据OLEDB规范,这是奇怪的行为,提供程序必须支持DBPROP_CONNECTIONSTATUS属性,因此在无效连接的情况下,它不会被返回到池中。
当远程计算机重新启动时,事情变得奇怪起来。池中的连接仍然无效,尽管连接打开成功,但在连接上的查询失败。Oracle OLEDB无法再连接到服务器,我们不得不重启应用程序。好吧,这是不希望发生的,因为我们的应用程序是关键应用程序。
有没有任何想法如何克服这个问题。
谢谢 Mubashir

我猜这不是一个.NET项目? 我问这个问题是因为我们在10g上使用ODP .NET驱动程序没有遇到任何问题,运作良好。 - Nate Pinchot
不,这不是.NET。我们在VC++项目中使用OLEDB提供程序与ADO连接Oracle。 - Mubashir Khan
你是否使用任何静态方法来打开数据库连接?虽然这是OLEDB/Oracle/VC++,但在.NET/SQL Server中有文档记录的行为表明当数据库连接在静态方法中打开时,会导致数据库池损坏。 - Phil Hunt
它是使用经典ADO的Oracle OLEDB和VC ++,而不是使用.NET提供程序。 - Mubashir Khan
4个回答

1
如果您正在以编程方式进行此操作,请使用try块,这样如果发生任何事情,它就不会失败。通过try块,您可以捕获异常并忽略它,从而使错误被消除。
您可以通过在将连接返回到池之前将连接标记为无效来告诉池不接受无效连接。

这个“标记连接无效”的功能在经典ADO中是如何实现的?整个过程应该由驱动程序自己完成。SQL提供程序可以正常工作,但Oracle提供程序不能。 - Mubashir Khan
原帖中说:“它被退回到池中而不是无效。”我的回答可能过于简单了。 - alexyorke

0

默认情况下,连接在10分钟后恢复。可以通过oledb提供程序的根键下的SPTimeout注册表键设置时间。


0

实际上,对于这个Oracle 11 32位OLEDB安装程序,默认的连接池超时时间至少为120秒。您可以在以下注册表设置中找到:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Oracle\KEY_orac

其中KEY_orac是KEY_<oracle_home_name>

密钥名称为ORAMTS_CONN_POOL_TIMEOUT,默认值为120。

似乎无法在连接字符串级别设置连接池参数。


-1
在大多数连接池实现中,可以在使用连接之前检查它。例如:您可以定义一个检查查询,如 select * from dual,如果从池中获取连接,则将执行此查询。如果失败,则该连接将被排除在池外,并将打开一个新连接。

1
DBPROP_CONNECTIONSTATUS 应该在驱动程序级别执行此操作,但 Oracle 提供程序不支持它。 - Mubashir Khan
你能想到这种方法的性能下降吗?连接池不是旨在“提高系统性能”吗? - Jaywalker
这取决于具体情况。在大多数情况下,它只会略微产生负面影响。如果您的连接池中不能容忍无效连接怎么办?在大多数生产系统中,这是不可选的。假设出现了短暂的网络问题,您就会失去数据库。那么所有的连接都将变为无效... - HamoriZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接