用TServerSocket写的通信,为什么工作10天以后会出现“SQL不存在或拒绝访问”(100分)

  • 主题发起人 主题发起人 asnychen
  • 开始时间 开始时间
A

asnychen

Unregistered / Unconfirmed
GUEST, unregistred user!
我用用TServerSocket写的通信,为什么在连续工作10天以后会出现“SQL不存在或拒绝访问”,我的代码如下:
procedure TmainFM.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sdsj: string; //收到数据
Ret : Integer;
begin
if socket.ReceiveLength > 0 then
begin
try
hMutex := CreateMutex(nil, False, '12345'); // 创建互斥对象
Ret:=GetLastError;
if Ret<>ERROR_ALREADY_EXISTS then
begin
sdsj:=socket.ReceiveText;
zhsj:=UTF8Decode(sdsj); //将UTF-8编码转换成string
if zhsj<>'' then
begin
memo2.Lines.Add('('+datetimetostr(now)+')收到数据:'+zhsj+'('+server.socket.connections[0].RemoteAddress+')');
MyPro;//我自定义的过程,在过程里动态创建一个TADOQuery连接SQL进行访问
socket.SendText(UTF8Encode(fhsj));
end;
end
else
begin
memo2.Lines.Add('('+datetimetostr(now)+')收到数据:'+zhsj+'('+server.socket.connections[0].RemoteAddress+')');
fhsj:='0#用户使用数量较多,请重试';
memo2.Lines.Add(fhsj);
socket.SendText(UTF8Encode(fhsj));
end;
finally
ReleaseMutex(hMutex);
CloseHandle(hMutex);
end;
end;
end;
试了很多,但一直找不到问题出在哪,创建互斥我在程序启动时创建也试过,不过在线程里不起作用,所以后来改成在线程里创建了。起了作用但是连续工作10天后就出现问题,中间不会出问题,当然不是说一到10天就出问题。
另外我用临界区也试还是出一样的问题。。。
请各位大哥帮帮我,问题出在哪?
 
有人能帮下我吗?
 
意思是每次只连接一次数据库,这样不必须用互斥对象,用现成:

Var
THBusy : Boolean = False;

Procedure Tmmm.Execute;
Begin
While (True) Do
Begin
If Terminated Then Exit;
While THBusy Do Sleep(1);
THBusy:=True;
try
MyProc;
finally
THBusy:=False;
end;
End;
End;

每次收到Socket请求就建立现成执行!
 
你到企业管理器中查一下当前已经连接的连接数。
可能:
1。数据库出问题,停了。
2。你的授权已经达到最大数量了。
 
不是很明白,在TServerSocket里不是本身就是多线程吗,你意思是我收到数据后,再自己建立一个线程,然后在线程执行中写入你上面的代码?
While (True) Do // 这句不知道起什么作用
Begin
If Terminated Then Exit; // 这应该是线程终止就退出
While THBusy Do Sleep(1); // 这不知道什么意思
THBusy:=True;
try
MyProc;
finally
THBusy:=False;
end;
End;
小弟对SOCKET还不是很熟练,也许问得比较弱智,望见谅!
当时用TServerSocket和Indy里的IDTCPserver,都出现这个问题后,我也查了一些资料没找到为什么,也问了一些朋友,对IDTCPserver这个通信加入临界区后问题解决了,但是TServerSocket一直没有真正的解决这个问题。希望大哥能再帮帮我,谢谢!!
 
aerobull,谢谢你的说明,不过你说的这个问题,我看过没问题,当我这个程序关闭后,其他连接数据库的程序可以马上恢复正常,应该是一个程序操作I/0接口时造成了未知的错误,但是我不知道是出在哪,但可以肯定是我的TServerSocket程序出了问题。
 
ServerClientRead 是非组塞方式,不是多现成,呵呵!
 
很可能是网络瞬间断开,导致tcp/ip无法 访问,如果你的程序和数据库服务器在一个机器上,用127.0.0.1可以解决,否则,
label restart:
try
adoquery....

exception
执行ping,
再重新连接数据库,再执行该操作
goto restart
 
谢谢你们大家的说明,我程序和数据库在同一服务器上的。
wql,对你给的代码,我不是很明白,能给我讲解下吗,谢谢了
 
顶下,希望有大哥能帮帮忙
 
你应该把myproc,贴出来为好,另外最好用线程试试
 
While (True) Do // 线程不循环,执行一次就结束了,所以要循环
Begin
If Terminated Then Exit; // 这应该是线程终止就退出,对

While THBusy Do Sleep(1); // 上一个任务正在处理,那么本次线程等待! sleep不占用CPU

THBusy:=True;
try
MyProc;
finally
THBusy:=False;
end;
End;
 
接受答案了.
 
后退
顶部