这更具体地说是SQL Server Reporting Services,但我也将此视为典型的.Net应用程序问题。
这是问题所在。我们使用SSRS来报告Oracle数据库中的数据。从第1天起,我们的用户抱怨他们收到的错误如ORA-2396:超过最长空闲时间,ORA-01012-未登录等。
我们已经包括了DBA,应用程序开发人员,网络工程师,但到目前为止我们找不到更好的线索。
最近在进行一些研究时,我观察到许多人已经记录了与oracle的.Net连接的一个“已知”问题。正如他们所提到的,如果我们使用连接池,则池中可能存在甚至无用的连接。在下一个请求时,可能会使用此连接,此时将引发错误。正如我们的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.如果是,解决方案是什么? 如果没有,那么最终会导致问题的原因。
如果您需要更多信息,请随时发表评论。
答案 0 :(得分:1)
此处的根本问题属于您的DBA。当我使用一个帐户(即我的个人oracle帐户)时,我看到相同的错误,该帐户可以成功运行我们的DBA进行的相同空闲连接清理。最好的解决方法是让他们为您分配一个“空闲时间后没有终止的服务”帐户。
那就是说,我猜你会得到“关键词不支持 - 验证连接”,因为你使用的是微软提供商,而不是oracle提供商。我对SSRS连接并不熟悉,所以我不确定你如何选择其中一个。在.net中,它是System.Data.OracleClient和Oracle.DataAccess之间的区别。
如果解决了这个问题,验证连接选项会在使用连接之前通过预先ping连接来增加开销,这使得它比简单地禁用池更好。您可以尝试的另一件事是设置最小池大小= 0,这使得池可以降低到零,从而使连接闲置的时间更短。不幸的是,这不是一个完美的解决方案,因为提供商只会在使用它们之后检查过时的连接。
如果您还没有oracle数据提供程序的连接字符串参数,请参考以下内容: http://download.oracle.com/docs/html/E10927_01/featConnecting.htm#i1006393
答案 1 :(得分:0)
这是一个已知问题,它出现在您使用连接池的任何地方,并且取决于几个方面 - 其中一个是服务器上的设置...有时甚至在使用Oracle RAC时也很复杂...... 一些Oracle .NET提供商有内置的解决方案,用于无缝地解决这个问题...一个这样的提供商是Devart销售的提供商...... http://www.devart.com/dotconnect/oracle/
我与Devart无关,只是一个快乐的客户......