中国石凳联盟 登录注册

一般性网络错误

rockage··0 回复·250 浏览

发表回复
昨天发现一个怪现象,在程序一切正常的情况下禁用网卡(或者拔掉网线),然后并不退出程序,并且不进行任何操作,再次接通网络,程序就会报一个“一般性网络错误。请检查网络文档。”的错误,更为麻烦的是,同样的操作,这个错误有时候会出现,有时候又不出现,十分不解。求助MSDN,关于这个错误有所描述,但却是基于Win2003的新特性TCP Chimney Offload功能所引发的,可问题在於WinXP压根就没有这项功能。除此之外就是一大堆关于这个问题的求助帖,基本上没有什么好的解决方案。

我在程序里会有许多SQL操作,每一个具体的操作都借用一个ADO Connection去执行,这些Connection都是局部变量,按理说在断网期间,程序是静默的,并没有触发什么,再次接通网线之后,每一个Connection又都是重新生成的,怎么会与之前的有冲突呢?这说不过去。

打开SQL2000的事件探查器,发现每次在我拔掉网线的瞬间,Duration值会产生一个异动,有时候甚至会大到几万甚至几十万,问题可能是出在这里了,我猜原因可能是当客户端发起一个SQL连接的时候,客户端和SQL服务器在底层会有一个连接维持的重连机制,在网络不畅的时候,依靠这个机制维持连接不至于让双方失去联系,但是当网线彻底被拔掉后,这个机制反而会起副作用,SQL服务器端不停地向客户端发出重连请求,瞬间有可能产生几万个连接请求,导致程序崩溃。后来进一步发现,当重新插好网线后,如果马上执行操作,必崩溃无疑;倘若你慢一点,等上几秒钟再执行操作,又一切正常。完全一样的操作,仅是快慢不一样,为什么后者又可以保持正常呢?大概是因为如果重连后很快执行操作,服务器仍然在忙于处理之前异常状态(很明显的直观感觉是机器变得很卡很慢),这种时候切入进去,非报错不可。

当然,以上仅仅是我的一堆猜想,并没有实际理论支持,但从Duration值的异动看来,确实和某种重连机制有关。基于这个理由,接下来的事情就变得轻松许多了,当我们发起一个SQL Connection,然后执行完某个操作的时候,应该显式地中断连接,而并不依靠SQL的重连机制,实际上很简单,在每一个用到了Connection的地方,最后都加一个Connection.Close即可。

经过实测,修改后的程序一切正常。









点赞0 收藏
发表回复
发表回复