ODP.NET:使用连接池避免连接超时
在一个站点,我可以使用SQL Developer连接到Oracle数据库,让它闲置很长时间(例如,> 60分钟),然后返回,这很好.在第二个站点,如果它保持空闲超过5-10分钟(我没有完全计算),它会使SQL Developer处于新操作超时的状态,我需要手动“断开连接”,然后按顺序重新连接做任何有用的事情.这似乎是第二个站点的连接超时,我不知道是什么导致它(我想知道如何关闭它,虽然这不是我的主要问题).
我的程序使用ODP.NET并处理spurts中的数据.每隔30分钟(为了讨论),它将获得一堆要处理的数据,这将涉及许多重复的连接.它还使用连接池.我已将连接池设置为使用5分钟的生命周期. 我在第二个站点(而不是第一个站点)看到的是我的程序将在每次突发数据开始时获得连接超时异常(例如,ORA-03113).我认为正在发生的是,在数据突增期间,连接池按设计使用.在突发结束时,将检查“连接生命周期”,并且连接不会太旧,因此它将保留在连接池中.然后,30分钟后,当新数据到达时,连接将从池中取出(并且不会检查生命周期或超时)并使用,并且正在超时,正如我在SQL Developer中看到的那样. 如何避免连接超时,但仍然可以在喷射过程中利用连接池?从文档(和我的经验)看来,连接仅在进入池时检查Lifetime,而不是在它出现时检查. 这是一个非常古老的问题,但我在应用程序中遇到了一些类似的问题,所以我认为一些信息可能会帮助其他任何人在这个问题上遇到问题.TL; DR摘要是ODP.NET驱动程序和.NET实现彼此之间不能很好地协作,因此您正常运行的铣削连接池设置似乎无法完全按照您的预期运行. >连接生命周期是主要罪犯.我不确定this blog是否仍然适用,因为它已经很老但我还没有找到任何文件来反驳它,它似乎验证了我所看到的行为.根据该博客,Connection Lifetime确实按预期杀死了旧会话,但只有在对数据库进行调用时才会检查此参数.换句话说,长时间运行的空闲会话永远不会被.NET杀死. 鉴于此信息,OP最初的问题很可能只是出现在一个站点中,这些问题来自不同数据库设置和/或.NET调用数据库的频率.他可能在两种环境中都遇到了问题,但是如果一个环境中的用户经常拨打电话以使Connection Lifetime完成它的工作,那么他将永远不会在该数据库中看到这些超时. 现在我仍然没有想到如何在任何Oracle IDLE_TIME狙击发生之前杀死.NET中的空闲连接,但只要你使用Data Validation = True参数,你就应该能够解决这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |