我手里的一个老项目,用的是Delphi scktsrvr.exe 架构的三层程序,用户数300左右。使用过程中,一直有用户反映,有时表格填写地好好的,提交时却报错:远程主机强迫关闭了一个现有的连接。
重新读了一下源码,没看出什么毛病。于是上网百度,终于了解到,用户和服务器之间的连接,由于各种原因断掉,就会有这样的提示。应该把它看做常态。于是我就想在Application.OnException事件中,捕获到该错误时,重新使客户端连接服务器。
然而,测试结果与我想的大相径庭。客户端重新连接前,先 disconnect。这一步就卡死了!无法 disconnect,就无法再 connect。我只好另想办法。
delphi 2010及后继的版本中,三层加入了心跳包概念。参照该概念,我在程序的主窗口中加了一个 TTimer。每当用户登录后,激活TTimer,每隔一段时间刷新一下用户权限(也可改为别的,如:刷新全局变量),一直保持数据库连接不断。
修改后测试,问题解决。
总结:解决办法不一定是最好的,但是最经济的!