我的midas设置如下:
应用服务器:database、query、DataSetProvider
客户端:SocketConnection、ClientDataSet
程序中的数据库操作代码如下:
    sql:=......//sql语句,以查询为例
    with ClientDataSet do
    begin
        Close;
        DataRequest(sql);
        Open;
    end;
    ......
问题描述(有点长):
    以上这种方式,一旦进行过数据库操作后,相应的midas就一直会开启在服务器上,连接直到程序关闭后才会断开。在一般情况下,这种方式程序运行很正常。但一旦因为各种原因导致数据库操作失败后,相应的连接也不释放,成为垃圾,越积越多,最后导致客户端的程序无法正常运行。为了避免这种情况,我在所有的数据库操作,即上文的Open后面加了一句:SocketConnection.Close。这样每次操作完数据库,服务端的midas会强制断开,下次要用的话再自动开启。同时在服务端的Socket Server中设置端口的TimeOut,启动超时断开机制,这样就避免了死连接始终不会释放的问题。
    修改后开始效果很好,但马上发现了一个更严重的问题。当我多个客户端同时用一个相同的ClientDataSet时,会发生严重的错误。大多数的时候只有一个客户端能返回查询结果,而其它客户端始终不返回结果,失去响应;有的时候索性每个客户端都同时报一个“灾难性故障”或“name not unique in this context”。当我把SocketConnection.Close去掉,重新用回原来的方法就没问题了。因此,估计就是因为强制关闭了SocketConnection导致服务端线程发生了某个错误。
    现在我只能又回到最开始的情况,当有死连接的时候手工断开,而无法使用Socket Server中的TimeOut。请问有什么办法能使midas自动关闭,或者使无效连接自动断开,而又不出现其它新的问题(由于项目比较大,而且已经进入尾声,所以不可能做很大的改动了。因此请不要建议改用其它的方式,比如ado什么的)?
    谢谢大家!

解决方案 »

  1.   

    你采用SocketConnection.Close,当然不行了,要是别人用着你关闭后别人也不能用了,也就会出现你所说的问题,解决的办法可以是各自用户创建一个连接,释放只能释放自己的,不能对别人的连接进行影响,那样,你就要很多连接,一个很好的办法就是用一个SocketConnection,然后其他的用SHARECONNECTION进行和SocketConnection连接,这样你每次打开时创建一个SHARECONNECTION,关闭的时候就是否SHANECONNECTION就可以了,不影响其他用户,实现多用户同时操作