RDBMS如何处理陈旧的连接?

时间:2009-06-06 23:17:18

标签: sql tcp rdbms

考虑建立与RDBMS的连接,然后对网络插头进行操作。 (你会得到的 如果连接通过NAT网关,并且网关决定清除该连接,则效果相同。)

此时,RDBMS服务器正在等待一个永远不会发生的查询。并且客户端不会关闭TCP连接,因为那不再是该网络。据推测,服务器不会关闭它,因为它仍然认为连接是打开的。

典型的RDBMS是否通过超时和/或在TCP上实现简单的keepalive机制来处理这个问题?任何人对Oracle,SQL Server和MySQL都有这方面的经验吗?

编辑;更多挖掘建议mysql在8小时不活动后清除连接。

6 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题。让我给你一个广泛的答案。

在客户端/服务器时代,这将是一个更大的问题,因为客户端保持与数据库的持久连接。如今,出于可伸缩性和其他原因,应用程序通常以“断开连接”的方式编写,从而与数据库建立连接以获取其数据,然后立即断开连接。换句话说,应用程序根据需要请求连接。

当发生“原子”操作时(即整个操作必须从头到尾成功完成),该操作将包装在事务中。如果在事务期间随时切断数据库连接,数据库系统将“回滚”该操作,将任何受影响的记录置于事务启动之前的相同状态。

超时确保任何与数据库的杂散连接都不会永远保持打开状态。

答案 1 :(得分:1)

当客户端或服务器丢弃底层TCP连接时,另一端的TCP / IP堆栈会检测到此情况并通知应用程序。您可以确定数据库服务器关闭连接(并回滚任何未提交的事务)。

更新:网络故障只是看到每一方都像另一方消失了。双方都会设置套接字超时,重试等,以便他们能够优雅地处理这些故障。 Jonathan在评论中提出了一个有趣的子问题,如果客户端显式断开连接而没有以任何方式终止事务,则服务器会执行隐式事务提交。

答案 2 :(得分:0)

您所谈论的具体情况并非真的发生。仅仅因为建立了连接,并不意味着RDBMS正在“等待”查询到达。它可能只是注意到连接的存在,启动异步读操作,然后继续它的业务。

如果异步读取从未完成是一个问题,那么当然,RDBMS可以实现定期“ping”机制,该机制将确定连接是否仍然是打开的。我想你已经知道了,TCP / IP连接只有在两端打开时才会打开,所以如果RDBMS向不再存在的客户端发送“ping”,那么写入会超时连接,服务器端将关闭。人们可能希望RDBMS注意到这一点,并销毁与该连接相关的任何服务器端资源。

答案 3 :(得分:0)

数据库连接通常是池化的,因此您不必每次都要承担建立连接的惩罚。应用程序服务器提供此功能,它们通常可以灵活地刷新连接池,并在检测到此陈旧连接状态时重新建立其池中的所有连接。

答案 4 :(得分:0)

Oracle JDBC驱动程序在连接类上提供了一个properytery ping()方法,如果连接被认为是“活动的”,则返回true。

不幸的是,ping()是由一个白痴实现的。它从服务器发送一个“从'双”查询中“选择'x',由于文字'x'的存在使查询缓存难以进行,因此远远不是一个影响较小的查询。

我们曾经在每次从池中借用连接时从我们的应用服务器调用ping(),直到它几乎杀死了我们的oracle服务器。

不推荐。

答案 5 :(得分:0)

在SQL Server中,连接(您可以通过sp_who查看)已关闭,并且将回滚未提交的事务。

我在客户端上看到的是,后续尝试从客户端进行相同连接(在重新连接VPN或NAT的情况下)通常会导致客户端出现传输错误,并且新连接是在SSMS的情况下为同一窗口中的后续批次创建。