在主线程中用conn.connected无法判断数据库连接是否正常,只好使用定时器,程序如下:
procedure TSuperviseInfaceService.TimerTimer(Sender: TObject);
var
sql:string;
begin
Timer.Enabled :=False;
try
sql:='select count(*) from AcceptItem';
TimerQuery.SQL.Text :=sql;
timerQuery.Connection:=Conn;
timerQuery.Open ;
timerQuery.Close ;
if sThreadTracData=nil then
begin
sThreadTracData:=ThreadTracData.Create(Conn,sURL);
self.LogMessage('aaaaaaaaaaaaaaaaaaaaaaaaaa');
end;
except on e:exception do
begin
try
if sThreadTracData<>nil then
sThreadTracData.Terminate ;
Conn.Close ;
Conn.Connected :=True;
if Conn.Connected then
sThreadTracData:=ThreadTracData.Create(Conn,sURL);
except on e:exception do
self.LogMessage(e.Message );
end;
self.LogMessage(e.Message);
end;
end;
Timer.Enabled :=True;
end;
用定时器执行一个查询,如果查询能打开记录集,我认为连接是正确的,如果打不开,那么我关掉线程,关掉连接,然后重新连接,如果连接成功后再重新开线程。这个办法有时候能够重新执行线程,有时候却不能重新执行线程。请问这是为什么?
procedure TSuperviseInfaceService.TimerTimer(Sender: TObject);
var
sql:string;
begin
Timer.Enabled :=False;
try
sql:='select count(*) from AcceptItem';
TimerQuery.SQL.Text :=sql;
timerQuery.Connection:=Conn;
timerQuery.Open ;
timerQuery.Close ;
if sThreadTracData=nil then
begin
sThreadTracData:=ThreadTracData.Create(Conn,sURL);
self.LogMessage('aaaaaaaaaaaaaaaaaaaaaaaaaa');
end;
except on e:exception do
begin
try
if sThreadTracData<>nil then
sThreadTracData.Terminate ;
Conn.Close ;
Conn.Connected :=True;
if Conn.Connected then
sThreadTracData:=ThreadTracData.Create(Conn,sURL);
except on e:exception do
self.LogMessage(e.Message );
end;
self.LogMessage(e.Message);
end;
end;
Timer.Enabled :=True;
end;
用定时器执行一个查询,如果查询能打开记录集,我认为连接是正确的,如果打不开,那么我关掉线程,关掉连接,然后重新连接,如果连接成功后再重新开线程。这个办法有时候能够重新执行线程,有时候却不能重新执行线程。请问这是为什么?
用多一个辅助线程监视,有问题,就挂起 "数据库断掉的时候线程关闭",挂起应该就可
var
sql:string;
begin
Timer.Enabled :=False;
try
sql:='select count(*) from AcceptItem';
TimerQuery.SQL.Text :=sql;
timerQuery.Connection:=Conn;
timerQuery.Open ;
timerQuery.Close ;
except on e:exception do
begin
try
if not sThreadTracData.Suspended then
begin
sThreadTracData.Suspend ;
self.LogMessage('bbbb');
end;
Conn.Close ;
Conn.Connected :=True;
if Conn.Connected then
begin
sThreadTracData.Resume ;
self.LogMessage('ccccc');
end;
except on e:exception do
self.LogMessage('a' + e.Message );
end;
self.LogMessage('b' + e.Message);
end;
end;
Timer.Enabled :=True;
end;
采用挂起线程,重新连接后唤起线程的方法,这样就存在数据库重新连接后,线程并不是继续运行
然后在主线现成中尝试连接,如果连接上了,将挂起的线程唤醒