Oracle连接到.Net - 连接池

3
这个问题更具体地说是与SQL Server Reporting Services有关,但我也认为这是一个典型的.NET应用程序问题。我们正在使用SSRS从Oracle数据库报告数据。从第一天开始,我们的用户就抱怨他们会出现像ORA-2396:超过最大空闲时间,ORA-01012-未登录等错误。
我们已经包括了DBA、应用程序开发人员、网络工程师,但到目前为止,我们还没有找到任何更好的线索。
最近,在进行一些研究时,我观察到许多人记录了一个与.NET连接到Oracle的“已知”问题。正如他们所提到的,如果我们使用连接池,可能会在池中保留不必要的连接。在下一次请求时,此连接可能会被使用,并在此时抛出错误。根据我们的DBA确认,我们的Oracle实例设置为在X分钟内处于空闲状态时终止连接。
以下是提到上述问题的链接 http://msdn.microsoft.com/en-us/library/8xx3tyca(v=VS.90).aspx http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx 还有几个链接。但是,我没有在任何地方得到一个非常确定的声明,即当前(最新版本的.NET和Oracle等)存在此问题。
对于解决方案部分,他们提到我们应该使用“Validate Connection = true”属性作为连接字符串的一部分。但如果我尝试使用它,它会说“不支持关键字-验证连接”。 (我也尝试过Validcon)
我的问题是: 1.确认存在从连接池中“脏读取”问题吗? 2.如果是这样,有什么解决办法? 3.如果不是,可能导致我们遇到问题的原因是什么?
如果您需要更多信息,请随时评论。

有效的 SQL Server 连接字符串在此处:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。您可能希望尝试关闭连接池:设置 Max Pool Size = 1 来实现此目的。 - Jeremy McGee
根据组织政策,不允许限制池大小或关闭池的选项。 - Subhash Dike
2个回答

1

这里的根本问题属于你们的数据库管理员。当我使用一个账户(例如我的个人Oracle账户)时,我也会看到同样的错误,因为我们的DBAs运行了相同的空闲连接清理。最好的解决方法是让他们为你分配一个“服务”账户,该账户在空闲时间后不会被终止。

话虽如此,我猜测你之所以收到“不支持的关键字 - 验证连接”,是因为你正在使用Microsoft提供程序而不是Oracle提供程序。我对SSRS连接并不是很熟悉,所以我不确定你如何选择其中之一。但在.NET中,它们之间的区别在于System.Data.OracleClient和Oracle.DataAccess。

如果你解决了这个问题,验证连接选项会增加开销,因为它会在使用连接之前预先ping一下连接,使其比简单禁用池化稍微好一些。你可以尝试的另一件事是将最小池大小设置为0,这样池就可以降至零,留下更小的机会让连接处于空闲状态太长。不幸的是,这并不是一个完美的解决方案,因为提供程序只在使用连接之后才检查过期的连接。

如果你还没有连接字符串参数的参考,请看这里:http://download.oracle.com/docs/html/E10927_01/featConnecting.htm#i1006393,这是Oracle数据提供程序的参考。


谢谢回复。是的,我意识到为什么连接字符串属性没有被识别。我也明白了DBA更改设置的观点。然而,我核心的问题是,连接池的行为是否像那样确认了呢?也就是说,在某些情况下,连接池中可能存在实际上根本无法使用的连接,并且在它们实际被使用之前没有任何方法将它们清除吗? - Subhash Dike
有一些编程上的事情可以做,但在SSRS的背景下,我认为除了禁用池化之外,你几乎无能为力(在我的看法中,这是一个完全合理的选择,因为在报告上下文中,连接创建可能是可以忽略不计的,而长查询时间和大型数据集则是常态)。由于连接生存期过期检查是在返回连接之后进行的,我认为没有保证的解决方案存在,只有可以减少问题的更改。 - b_levitt
这是一个链接,如果您想继续使用MS提供程序,我认为这将是您的连接字符串选项:http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection.connectionstring(VS.80).aspx - b_levitt

0

这是一个已知的问题,它发生在任何使用连接池的地方,并且取决于几个因素 - 其中之一是服务器上的设置... 当使用Oracle RAC时有时甚至更加复杂... 一些Oracle .NET提供程序具有内置的池化解决方案,可以无缝处理此问题... Devart出售的提供程序就是其中之一... http://www.devart.com/dotconnect/oracle/

我与Devart没有关联,只是一个满意的客户...


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