急救:三层结构中,客户端退出后即无法连接服务器

时间:2022-07-30 03:29:17
目前在做一个管理系统,采用三层结构,客户端采用SocketConnection,差不多有10几台客户端在使用系统。
每次在客户使用一段时间之后,就会出现客户端退出后即无法连接服务器,新的客户端也无法连接服务器,会出现无限时间等待,但如果已经连接上的客户则可以正常使用。
重启服务器之后又可以,但一段时间之后又会出现相同的问题。并且非常频繁,差不多每天都会有相同的问题?

请问如何解决?

46 个解决方案

#1


在线等待

#2


无法连接服务器的概念,是无法连接服务器主机还是能连接主机但连接不上应用服务器?

#3


是客户端连接不上应用服务器,应用服务器和数据库服务器放在同一电脑上!

#4


不知道你的应用服务器是怎样构建和设置的,不好说,建议你换成DCOMConnection试试,我以前做过一次,用SocketConnection也是经常连不上,但是没你说的严重,我的是远程客户摩登连接,与电信电话交换机质量有关,后来换成DCOMConnection连接,就没出现过连接不通的问题。

#5


客户端和应用服务器都在局域网内,服务器采用Mulitple Instance 和Apartment的Treading Model。
应该不是SocketConnection的问题,如果某个客户端没有退出,则可以正常使用。但新的客户端却连接不上!觉得非常奇怪!

#6


这就不明白了,难道是数据库服务器客户许可数量的问题?

#7


肯定不是,因为所有进程都共享一个连接!所以整个系统都只有一个连接?
我也问了一下朋友,他说是有连接未被释放!
那应该如何自动释放未被释放的连接呢?

#8


我上面说的不是应用服务器,而是指数据库服务器。
你的远程数据模块的DataSet是不是在设计期就是打开的?如果是,把它们全部关闭,客户端连接后,存取数据时它们会自动打开的。是不是这个原因导致连接不能释放?

#9


还有,你的数据库连接是什么元件,ADO?

#10


呵呵,可能是我说得不够清楚!
1:所有的客户端连接都共享一个数据库服务器连接
2:数据库连接和数据集元件均采用ADO
3:所有的远程数据模块的DataSet都是用完后立即关闭的!

#11


这就不好说了,ADOConnection是放在远程模块上的?

#12


不是,ADOConnection是放在本地数据模块上的!

#13


对不起,我觉得你应用服务器架构和设置都没问题,我水平有限,爱莫能助了。^_^

#14


呵呵,不能这么说,还是得感谢你!以后还要向你多多请教呢!
如果问题解决了的话,我会及时结贴,同时会把具体的原因和解决方法公布上来,希望能给后来的人一个参考吧!

大家如果对这个问题或相关的问题,如果有什么看法的话!还希望能够不吝赐教啊!呵呵!

#15


你的朋友说的很对,应该是客户端退出后,应用服务器上对应的远程模块线程没释放,导致新客户上不去,问题是什么原因导致线程不能被释放?郁闷!

#16


网络中断之后,对应的远程数据模块结程应该会自动释放的吧!

#17


网络中断之后,对应的远程数据模块结程应该会自动释放的吧!
==================================================================================
很难说,你可以在应用服务器上临时加个Label显示用户连接个数,每次用户连接和退出看是否有变化

#18


我试过,用户数都能正常减少!还会不会有其它方面的原因呢!

#19


我试过,用户数都能正常减少!还会不会有其它方面的原因呢!
那就不是程序本身问题了,也就是说,线程已经正确释放了。从网络、域服务器设置进行检查。

#20


我明天再去客户现场去一次!具体作多方面的测试一下!呵呵!在这里先谢了!

#21


建议使用netstat查看连接状态
怀疑是TCP的连接没有正常关闭

#22


那应该怎样去处理没有正常关闭的TCP连接呢?
正常情况哪此原因会造成相关方面的问题呢》?麻烦各位高人指点一二!

#23


是不是关闭时没有释放连接?

#24


回复:zhmnsw(糖醋鼻子) 是不是关闭时没有释放连接?
--------------------------------------------------------------------------
这种问题基本不存在!这几天都在加夜班到3-4点钟啊!
上天给我的时间真是太少了!

真诚希望各位兄弟能给点在解决相关问题中的一些经验?
我会很快结贴的!先谢了!

#25


估计最大的可能是你的Socket Server代理服务器的配置出了问题

一般来说Socket Server的默认端口是211,而且允许的最大连接数是10,请将它(Thread Cache Size 这一栏代表最大允许的客户端连接数)改大一些如200,然后Apply一下

#26


绝对不是Socket Server的问题
那个10是线程池大小。

#27


yongshiok(大勇)说的对,Thread Caching是线程池大小,
我今天现场跟踪发现,某个客户端退出之后,在应用服务器中的远程模块已经释放,
但是在Socket Server中的Users连接仍然存在!不知是何原因?

据目前的情况来看,造成客户端无法连接服务器应该是这个原因造成?
但是为什么客户端退出后,应用服务器中的远程模块已经释放,而Users中的连接仍然存在呢?

#28


兄弟们,很急啊!客户哪里基本每天都会出现这种情况!实在是受不了了!
早知道三层这么多问题,当初用两层就好了!

可我们应该多扩展一下自己知识!三层毕竟有它很多优越的地方吧!

可现在这种情况,实在是让人受不了!

#29


楼主还没搞定阿!改用DCOM连接试试。

#30


呵呵,是啊,急啊!今天我在本地测试的时候发现了一个问题!

我同时开启了10几个测试程序,用定时器向服务器数据库表中插入一条记录!
会不时的弹出“连接忙不能执行其它命令”
我在跟踪服务器的过程中,发现了一个问题:

服务器跟踪过程中,会造成所有客户端不能正常使用,我会任务管理器强行退所有客户端!
这时就出现了与客户端相同的情况:所有客户端在应用服务器中已经注销,
可在Socket Server中,所有的连接都没有Disconnet掉!然后新的用户应不能再登陆了!

可为什么在实际应用中,为什么也会出现这样的情况呢!

如果不是在服务器跟踪过程中,则运行很长时间都没问题,只是会不时的弹出“连接忙不能执行其它命令”,不影响服务器和客户端任何操作!

#31


把ADOConnection放在远程数据模块上

#32


回复:madyak(无天) 把ADOConnection放在远程数据模块上
-------------------------------------

呵呵,那我还不如用二层呢!问题的关键应该不是出在这里!关于弹出的提示,客户端系统都可以解决掉,关键是客户端不定时的不能连接服务器的问题!

#33


SocketConnection有BUG...不建议用了. 

我公司在用的当时居然是问 borland拿到源码后自己处理的...来解决连接后不能再连接的问题. 

用COM+吧.

#34


socketconnection 本来就有原代码的。

#35


我刚开始回复就说过,我以前碰到过这种问题,改用DCOM连接就好了,现在看来,应该还是这个问题,还是改DCOM吧!

#36


1.换DCOM不知能带来多大的问题,我也没测试过
2.源程序端会有多大的改动,因为这个系统算是一个中型的系统了!
  她关系到企业的大部分部门,十几个主模块(上百个子模块)的生产型企业应用实时管理系统。
3.当初选用SocketConnection时,主要考虑的是客户的老板需要远程访问(通过ADSL远程访问)

所有目前时间上也不允许采用DCOM了!

目前我正在分析socket的源程序,希望能找出解决的办法!

在其中我有查到,如果应用服务器端如果是一个以上的CPU的,好像会出问题的!
而且我现在客户的服务器也正好是双CPU的!会不会真的是这个原因造成的呢!
呵呵,不行的话,让他们加一台应用层服务器试试,与数据库服务器物理分离!

我会急时的发布解决问题的过程!

如果大家有兴趣的话,可以多来这里坐一下!

#37


好象双CPU是有问题,网上有专门修正过的版本

#38


我也希望能尽早解决这个问题!同时也谢谢各位指点!

周末要回一趟安徽老家了,很想女儿了!呵呵,题外话!
也快要到元旦了!提前祝兄弟姐妹们新年快乐,身体健康!年底分红不要手软哦!呵呵!

周末前结贴!

#39


不知谁有Delphi2006的SockSvr.exe的执行文件和相关源程序,可不可以发给我一份!

真的是太急了!我也没有Delphi2006!这几天一定要解决这个问题啊!都拖了几个星期了!
而且周末还得回一趟老家(家里有事要办),弄得没办法向客户交待啊!

#40


我现在也碰到Scktsrvr的问题,跟楼主有点不一样。

可能跟双CPU有关系,可以先用普通的机器充当一下应用服务器,进行测试

#41


老版本的 Scktsrvr 是不支持多CPU的,换个高点版本的 Scktsrvr 就可以了.

#42


我现在用的都是Delphi7的了,而且ScktSrvr都是Fix后的版本,但还是不行!
明天去买Delphi2006试试!

#43


oh!上帝,祝我好运吧!我实在是受不了!

#44


楼主QQ是多少,希望和你交流一下。多谢了。我的是310076689;

#45


上次走得太匆忙了!没能急时结贴!
今天才赶回来,先把贴结了吧!
目前,应该说不是ScktSrvr的问题了,经过这段时间来的检查,
还是我的服务器这边的程序设计上有点BUG,主要是集中在客户端的数据批量提交上!

#46


ScktSrvr的Fix后的版本是可以使用的,采用SocketConnection连接的技术还是比较成熟的!大家可以放心使用!
如果我们在本身程序设计上,对数据的处理比较完善的话,数据的传输执行效率还是比较不错的!

#1


在线等待

#2


无法连接服务器的概念,是无法连接服务器主机还是能连接主机但连接不上应用服务器?

#3


是客户端连接不上应用服务器,应用服务器和数据库服务器放在同一电脑上!

#4


不知道你的应用服务器是怎样构建和设置的,不好说,建议你换成DCOMConnection试试,我以前做过一次,用SocketConnection也是经常连不上,但是没你说的严重,我的是远程客户摩登连接,与电信电话交换机质量有关,后来换成DCOMConnection连接,就没出现过连接不通的问题。

#5


客户端和应用服务器都在局域网内,服务器采用Mulitple Instance 和Apartment的Treading Model。
应该不是SocketConnection的问题,如果某个客户端没有退出,则可以正常使用。但新的客户端却连接不上!觉得非常奇怪!

#6


这就不明白了,难道是数据库服务器客户许可数量的问题?

#7


肯定不是,因为所有进程都共享一个连接!所以整个系统都只有一个连接?
我也问了一下朋友,他说是有连接未被释放!
那应该如何自动释放未被释放的连接呢?

#8


我上面说的不是应用服务器,而是指数据库服务器。
你的远程数据模块的DataSet是不是在设计期就是打开的?如果是,把它们全部关闭,客户端连接后,存取数据时它们会自动打开的。是不是这个原因导致连接不能释放?

#9


还有,你的数据库连接是什么元件,ADO?

#10


呵呵,可能是我说得不够清楚!
1:所有的客户端连接都共享一个数据库服务器连接
2:数据库连接和数据集元件均采用ADO
3:所有的远程数据模块的DataSet都是用完后立即关闭的!

#11


这就不好说了,ADOConnection是放在远程模块上的?

#12


不是,ADOConnection是放在本地数据模块上的!

#13


对不起,我觉得你应用服务器架构和设置都没问题,我水平有限,爱莫能助了。^_^

#14


呵呵,不能这么说,还是得感谢你!以后还要向你多多请教呢!
如果问题解决了的话,我会及时结贴,同时会把具体的原因和解决方法公布上来,希望能给后来的人一个参考吧!

大家如果对这个问题或相关的问题,如果有什么看法的话!还希望能够不吝赐教啊!呵呵!

#15


你的朋友说的很对,应该是客户端退出后,应用服务器上对应的远程模块线程没释放,导致新客户上不去,问题是什么原因导致线程不能被释放?郁闷!

#16


网络中断之后,对应的远程数据模块结程应该会自动释放的吧!

#17


网络中断之后,对应的远程数据模块结程应该会自动释放的吧!
==================================================================================
很难说,你可以在应用服务器上临时加个Label显示用户连接个数,每次用户连接和退出看是否有变化

#18


我试过,用户数都能正常减少!还会不会有其它方面的原因呢!

#19


我试过,用户数都能正常减少!还会不会有其它方面的原因呢!
那就不是程序本身问题了,也就是说,线程已经正确释放了。从网络、域服务器设置进行检查。

#20


我明天再去客户现场去一次!具体作多方面的测试一下!呵呵!在这里先谢了!

#21


建议使用netstat查看连接状态
怀疑是TCP的连接没有正常关闭

#22


那应该怎样去处理没有正常关闭的TCP连接呢?
正常情况哪此原因会造成相关方面的问题呢》?麻烦各位高人指点一二!

#23


是不是关闭时没有释放连接?

#24


回复:zhmnsw(糖醋鼻子) 是不是关闭时没有释放连接?
--------------------------------------------------------------------------
这种问题基本不存在!这几天都在加夜班到3-4点钟啊!
上天给我的时间真是太少了!

真诚希望各位兄弟能给点在解决相关问题中的一些经验?
我会很快结贴的!先谢了!

#25


估计最大的可能是你的Socket Server代理服务器的配置出了问题

一般来说Socket Server的默认端口是211,而且允许的最大连接数是10,请将它(Thread Cache Size 这一栏代表最大允许的客户端连接数)改大一些如200,然后Apply一下

#26


绝对不是Socket Server的问题
那个10是线程池大小。

#27


yongshiok(大勇)说的对,Thread Caching是线程池大小,
我今天现场跟踪发现,某个客户端退出之后,在应用服务器中的远程模块已经释放,
但是在Socket Server中的Users连接仍然存在!不知是何原因?

据目前的情况来看,造成客户端无法连接服务器应该是这个原因造成?
但是为什么客户端退出后,应用服务器中的远程模块已经释放,而Users中的连接仍然存在呢?

#28


兄弟们,很急啊!客户哪里基本每天都会出现这种情况!实在是受不了了!
早知道三层这么多问题,当初用两层就好了!

可我们应该多扩展一下自己知识!三层毕竟有它很多优越的地方吧!

可现在这种情况,实在是让人受不了!

#29


楼主还没搞定阿!改用DCOM连接试试。

#30


呵呵,是啊,急啊!今天我在本地测试的时候发现了一个问题!

我同时开启了10几个测试程序,用定时器向服务器数据库表中插入一条记录!
会不时的弹出“连接忙不能执行其它命令”
我在跟踪服务器的过程中,发现了一个问题:

服务器跟踪过程中,会造成所有客户端不能正常使用,我会任务管理器强行退所有客户端!
这时就出现了与客户端相同的情况:所有客户端在应用服务器中已经注销,
可在Socket Server中,所有的连接都没有Disconnet掉!然后新的用户应不能再登陆了!

可为什么在实际应用中,为什么也会出现这样的情况呢!

如果不是在服务器跟踪过程中,则运行很长时间都没问题,只是会不时的弹出“连接忙不能执行其它命令”,不影响服务器和客户端任何操作!

#31


把ADOConnection放在远程数据模块上

#32


回复:madyak(无天) 把ADOConnection放在远程数据模块上
-------------------------------------

呵呵,那我还不如用二层呢!问题的关键应该不是出在这里!关于弹出的提示,客户端系统都可以解决掉,关键是客户端不定时的不能连接服务器的问题!

#33


SocketConnection有BUG...不建议用了. 

我公司在用的当时居然是问 borland拿到源码后自己处理的...来解决连接后不能再连接的问题. 

用COM+吧.

#34


socketconnection 本来就有原代码的。

#35


我刚开始回复就说过,我以前碰到过这种问题,改用DCOM连接就好了,现在看来,应该还是这个问题,还是改DCOM吧!

#36


1.换DCOM不知能带来多大的问题,我也没测试过
2.源程序端会有多大的改动,因为这个系统算是一个中型的系统了!
  她关系到企业的大部分部门,十几个主模块(上百个子模块)的生产型企业应用实时管理系统。
3.当初选用SocketConnection时,主要考虑的是客户的老板需要远程访问(通过ADSL远程访问)

所有目前时间上也不允许采用DCOM了!

目前我正在分析socket的源程序,希望能找出解决的办法!

在其中我有查到,如果应用服务器端如果是一个以上的CPU的,好像会出问题的!
而且我现在客户的服务器也正好是双CPU的!会不会真的是这个原因造成的呢!
呵呵,不行的话,让他们加一台应用层服务器试试,与数据库服务器物理分离!

我会急时的发布解决问题的过程!

如果大家有兴趣的话,可以多来这里坐一下!

#37


好象双CPU是有问题,网上有专门修正过的版本

#38


我也希望能尽早解决这个问题!同时也谢谢各位指点!

周末要回一趟安徽老家了,很想女儿了!呵呵,题外话!
也快要到元旦了!提前祝兄弟姐妹们新年快乐,身体健康!年底分红不要手软哦!呵呵!

周末前结贴!

#39


不知谁有Delphi2006的SockSvr.exe的执行文件和相关源程序,可不可以发给我一份!

真的是太急了!我也没有Delphi2006!这几天一定要解决这个问题啊!都拖了几个星期了!
而且周末还得回一趟老家(家里有事要办),弄得没办法向客户交待啊!

#40


我现在也碰到Scktsrvr的问题,跟楼主有点不一样。

可能跟双CPU有关系,可以先用普通的机器充当一下应用服务器,进行测试

#41


老版本的 Scktsrvr 是不支持多CPU的,换个高点版本的 Scktsrvr 就可以了.

#42


我现在用的都是Delphi7的了,而且ScktSrvr都是Fix后的版本,但还是不行!
明天去买Delphi2006试试!

#43


oh!上帝,祝我好运吧!我实在是受不了!

#44


楼主QQ是多少,希望和你交流一下。多谢了。我的是310076689;

#45


上次走得太匆忙了!没能急时结贴!
今天才赶回来,先把贴结了吧!
目前,应该说不是ScktSrvr的问题了,经过这段时间来的检查,
还是我的服务器这边的程序设计上有点BUG,主要是集中在客户端的数据批量提交上!

#46


ScktSrvr的Fix后的版本是可以使用的,采用SocketConnection连接的技术还是比较成熟的!大家可以放心使用!
如果我们在本身程序设计上,对数据的处理比较完善的话,数据的传输执行效率还是比较不错的!