gpt4 book ai didi

.net - ODP.NET:使用连接池避免连接超时

转载 作者:行者123 更新时间:2023-12-04 08:46:13 25 4
gpt4 key购买 nike

在一个站点上,我可以使用SQL Developer连接到Oracle数据库,将其长时间闲置(例如,> 60分钟),然后返回,就可以了。在第二个站点上,如果它闲置超过5-10分钟(我还没有确切计算),它将使SQL Developer处于新操作将超时的状态,我需要手动“断开连接”,然后按顺序重新连接做任何有用的事情。这似乎是第二个站点的连接超时,我不知道是什么原因造成的(尽管我不是主要问题,但我想知道如何将其关闭)。

我的程序使用ODP.NET并处理突发数据。每隔30分钟(出于讨论目的),它将处理一堆数据,其中涉及许多重复的连接。它还使用连接池。我将连接池设置为使用5分钟的生命周期。

我在第二个站点(而不是第一个站点)看到的是,我的程序将在每次数据突增开始时获得连接超时异常(例如ORA-03113)。我认为正在发生的是在数据突增期间,连接池是按设计使用的。突增结束时,将检查“连接生存时间”,并且连接不是太旧,因此将其保留在连接池中。然后,在30分钟后,当有新数据到达时,就像我在SQL Developer中看到的那样,将连接从池中取出(并且不检查生存期或超时),并且使用该连接并将其超时。

我如何避免连接超时但在突增期间仍然可以利用连接池?从文档(和我的经验)看来,仅在连接进入池时才检查连接的生命周期,而不是在连接断开时才对其进行检查。

最佳答案

这是一个确实很老的问题,但是我在应用程序中遇到了一些类似的问题,因此我认为其中一些信息可能会对遇到此问题的其他人有所帮助。

TL; DR摘要是ODP.NET驱动程序和.NET实现不能很好地配合使用,因此您正常运行的Mill连接池设置似乎并没有达到您期望的效果。

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

  • 有了这些信息,OP的原始问题很可能仅出现在一个站点中,这是由于不同数据库设置和/或.NET调用数据库的频率的组合所致。他可能在两个环境中都遇到了问题,但是如果一个环境中的用户频繁进行调用以使 Connection Lifetime能够正常工作,那么他将永远不会在该数据库中看到这些超时。

    现在,我仍然没有弄清楚如何在进行任何Oracle IDLE_TIME狙击之前杀死.NET中的空闲连接,但是只要您使用 Data Validation = True参数,您就应该能够解决此问题。

    关于.net - ODP.NET:使用连接池避免连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399224/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com