2010-12-09 118 views
6

在一个网站,我可以连接到Oracle数据库与SQL开发,把它闲置了很长的时间(例如,> 60分钟),并返回超时,和它的罚款。在第二个站点,如果它闲置超过5-10分钟(我没有准确计算),它将使SQL Developer处于新操作超时的状态,我需要手动“断开连接”,然后按顺序重新连接做任何有用的事情。这似乎是第二个站点的连接超时,我不知道是什么原因造成的(我想知道如何关闭它,虽然这不是我的主要问题)。ODP.NET:避免与连接连接池

我的程序使用ODP.NET并处理突然出现的数据。每隔30分钟(为了讨论的缘故),它会得到一堆数据来处理这将涉及许多重复的连接。它也使用连接池。我已经设置连接池使用5分钟的生命周期。

什么,我在第二现场看到(而不是在第一)是我的程序将获得连接超时异常(例如,ORA-03113)在每个数据突发开始。我认为正在发生的事情是,在数据突发期间,连接池按设计使用。在喷发结束时,检查“连接生存期”,并且连接不太旧,所以它留在连接池中。然后,30分钟后,当新数据到达时,连接将从池中取出(并且不会检查生存期或超时)并使用,并且正在超时,就像我在SQL Developer中看到的那样。

我怎样才能避免连接超时,但仍然采取喷期间利用连接池?从文档(以及我的经验)看来,连接只在进入游泳池时才被检查,而不是在连接出现时才被检查。

+0

在这些问题上没有足够的知识,但我们有一个非常类似的问题(更改了数据中心)。新的数据中心将会终止任何超过X分钟的任何未开放活动的端口(我们遇到的问题与您在SQL Developer和其他长时间运行的流程中所遇到的问题完全相同),我们拒绝了主机公司,他们结束了(但他们简单地建议我们实施一个脉冲,只是为了ora连接而被拒绝),但它需要他们的努力。祝你好运! – Harrison 2010-12-09 19:31:36

回答

-1

您可以通过将OracleCommand.ConnectionTimeout属性设置为0来指定无限超时。 在这种情况下,不会有超时(至少在客户端)。

ConnectionPool也用于这种情况。

+0

谢谢托尼,但我相信这个设置告诉我们Oracle等待响应需要多长时间,我看到的问题是,连接进入一个永远不会得到响应的状态,所以这个设置可以避免这个异常,但是我的程序仍然不会得到响应 - 所以我不认为这是一个解决方案。 – 2010-12-12 15:14:38

1

如果5分钟寿命设置是在第一个网站做得不错,那么我认为这可能是由别人设定空闲会话超时在Oracle服务器端配置文件引起的。

然而,随着5分钟寿命设置下,仍然会打超时当你的小高潮变得更大,因为当你返回到旁边的小高潮池中的联系,他们会被摧毁。然后池将会忙于创建和删除连接,并且可能会导致连接超时,当负载非常大时。

1

这是一个非常古老的问题,但我一直在用的应用遇到了一些类似的问题,所以我觉得有些信息可能会帮助别人谁碰到这个问题车次。

TL; DR摘要是,ODP.NET驱动程序和.NET实现不能很好地相互协作,所以您正常运行的连接池设置似乎并不完全符合您的预期。

  • 连接生命期是主要罪犯。我不确定this blog是否仍然适用,因为它已经很老了,但我还没有发现任何文档可以驳斥它,它似乎验证了我所看到的行为。根据博客,Connection Lifetime会按预期杀死一个较旧的会话,但只有在对数据库进行调用时才会对此参数进行检查。换句话说,长时间运行的空闲会话永远不会被.NET杀死。
  • 如果您有IDLE_TIME设置为您的Oracle用户配置文件(而不是UNLIMITED)中的值,那么数据库最终会将这些长时间运行的空闲参数设置为SNIPED。这可能最终导致.NET方面的问题,因为除非明确检查你的连接是否仍然打开,否则.NET将提供这些SNIPED连接,就好像它们仍然可用(从而引发上面的超时ORA错误)。
  • 围绕此问题的技巧是确保您的连接字符串中有Data Validation=True;。这可确保.NET在连接到下一个服务调用之前检查会话连接。当此验证看到SNIPED会话时,它会从.NET连接池中删除它。

鉴于此信息,OP最初的问题很可能是由于不同数据库设置和/或.NET调用数据库频率的组合而出现在一个站点中。他可能在这两种环境中都遇到了问题,但是如果用户在一个环境中经常拨打电话Connection Lifetime来完成它的工作,那么他将永远不会在该数据库中看到这些超时。

现在我还没有想出如何在任何Oracle IDLE_TIME狙击发生之前杀死.NET中的空闲连接,但只要使用Data Validation = True参数,您希望能够解决此问题。