2011-07-18 227 views
3

这更具体地说是与SQL Server Reporting Services相关,但我也将其视为典型的.Net应用程序问题。Oracle与.Net的连接 - 连接池

这是问题所在。我们正在使用SSRS报告来自Oracle数据库的数据。从第1天起,我们的用户抱怨他们得到如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.如果不是,可能是导致我们结束的问题。

如果您需要更多信息,请随时发表评论。

+0

有效的SQL Server连接字符串在这里:http://msdn.microsoft.com/en-我们/库/ system.data.sqlclient.sqlconnection.connectionstring.aspx。您可能想尝试关闭连接池:将最大池大小设置为1来执行此操作。 –

+0

根据组织政策,禁止有关限制池大小或关闭池的选项。 –

回答

0

这是一个已知问题,它发生在使用连接池的任何地方,并取决于几件事情 - 其中之一是服务器上的设置...有时甚至在使用Oracle RAC时很复杂...... 某些Oracle。 NET提供商有内置的解决方案,可以无缝地集中处理这个问题...... Devart销售的一个此类提供商... http://www.devart.com/dotconnect/oracle/

我不属于Devart,只是一个快乐的客户...

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

+0

感谢您的回复。是的,我意识到为什么连接字符串属性不recogzined。我还看到关于DBA改变设置的观点。但是,我的核心问题是,它是否证实连接池行为只是这样?即在某些情况下,池中可能存在实际上根本不可用的连接,并且在实际使用之前无法清除它们? –

+0

有一些程序化的东西你可以做,但在SSRS的情况下,我会说除了禁用池化之外,没有什么可以做的了(在我看来,这是一个完全合法的选择,考虑到在报告环境中连接创建可能可以忽略不计长查询时间和大型数据集是常态)。 由于在连接返回后检查连接生存期到期,我认为不存在保证的解决方案,只有可以减少问题的更改。 –

+0

如果想继续使用MS提供程序http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection.connectionstring(VS),可以使用以下链接指向我的连接字符串选项。 80)的.aspx –