Oracle OLEDB连接池和无效连接

Oracle OLEDB连接池和无效连接,oracle,connection,oledb,ado,pooling,Oracle,Connection,Oledb,Ado,Pooling,我们正在使用ADO访问Oracle10gRelease2,即Oracle10g的Oledb提供商。我们在连接池方面面临一些问题。数据库驻留在远程计算机上,连接池正在按其应有的方式进行。但是,如果远程计算机由于某种原因停机,连接将从池中返回,并且对该连接的查询将失败。当此连接关闭时,它将返回到池中,而不是无效。后续连接打开请求成功,但查询失败。这是一种奇怪的行为,根据OLEDB规范,提供程序必须支持DBPROP_CONNECTIONSTATUS属性,因此在连接无效的情况下,它不会返回到池中 当远程

我们正在使用ADO访问Oracle10gRelease2,即Oracle10g的Oledb提供商。我们在连接池方面面临一些问题。数据库驻留在远程计算机上,连接池正在按其应有的方式进行。但是,如果远程计算机由于某种原因停机,连接将从池中返回,并且对该连接的查询将失败。当此连接关闭时,它将返回到池中,而不是无效。后续连接打开请求成功,但查询失败。这是一种奇怪的行为,根据OLEDB规范,提供程序必须支持DBPROP_CONNECTIONSTATUS属性,因此在连接无效的情况下,它不会返回到池中

当远程机器出现时,事情就变得不正常了。池中的连接仍然无效,尽管连接打开成功,但对连接的查询失败。Oracle OLEDB无法再连接到服务器,我们必须重新启动应用程序。这是不希望的,因为我们的应用程序是一个关键应用程序

关于如何克服这一点有什么想法吗

谢谢
Mubashir

如果您以编程方式执行此操作,请使用try块,这样,如果确实发生了某些事情,它就不会失败。使用try块,您可以捕获异常并忽略它,从而消除错误


您可以通过在连接返回池之前将其标记为无效来告诉池不接受无效连接。

在大多数连接池实现中,可以在使用连接之前检查连接。例如:您定义了一个类似select*from dual的检查查询,如果您从池中选择了一个连接,则将执行此查询。如果失败,则连接将从池中排除,并打开一个新连接。

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

实际上,对于此Oracle 11 32位oledb安装,默认连接池超时至少为120秒。您可以在以下位置找到注册表设置:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Oracle\KEY_orac
这里的钥匙是orac_

密钥名为ORAMTS_CONN_POOL_TIMEOUT,默认值为120


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

我不认为这是一个.NET项目?我这样问是因为我们在10g上的ODP.NET驱动程序没有问题,工作得很好。我们在VC++项目中使用OLEDB provider for oracle和ADO,您是否使用任何静态方法打开数据库连接?由于这是OLEDB/Oracle/VC++,这是一个长期的尝试,但在.NET/SQL Server中,当以静态方法打开数据库连接时,有记录的数据库池损坏行为。其Oracle OLEDB和VC++使用经典ado。不使用.NET providershow是因为经典ado提供了“标记连接无效”功能。这一切都应该由司机自己来完成。SQL provider工作正常,但oracle provider没有。OP说“它将返回到池中,而不是无效。”我的回答可能过于简单。DBPROP_CONNECTIONSTATUS应该在驱动程序级别执行此操作,但oracle provider不正确支持它。您能想到这种方法的性能下降吗?连接池不是意味着“提高系统性能”吗?这取决于具体情况。在大多数情况下,这只是一个轻微的负面影响。如果您负担不起池中的无效连接怎么办?在大多数生产系统中,这不是一个选项。让我们想象一下,有一个短暂的网络问题,你失去了你的数据库。那么所有的连接都将无效。。。