多线程连接数据库问题。
sgjie 2012-09-15 11:23:58 软件分本地paradox数据库,服务器是oracle或者sqlserver。 如果操作服务器的时候如果服务器关机或者死机,这个时候操作就长时间无响应。于是把这个操作放到 多线程里面去。但问题出现了,即使我用了2个session。 当操作服务器数据库的时候,在线程中连接不到数据库,这个时候,在主线程中执行本地数据库的操作,立即失去响应,直到线程中的操作等待反应过来才执行本地的数据库操作,不是本地无响应,是执行本地数据库open时需要等待才行。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;
type
TForm1 = class(TForm)
Session1: TSession;
Session2: TSession;
Query1: TQuery;
Query2: TQuery;
Database1: TDatabase;
Database2: TDatabase;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
Database3: TDatabase;
Query3: TQuery;
Session3: TSession;
DataSource3: TDataSource;
DBGrid3: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TThreadQuery = class(TThread) //羘絬祘摸
private
FQuery: TQuery; {絬祘い琩高舱ン}
FDataSource: TDataSource; {籔琩高舱ン闽计沮稰舱ン}
procedure ConnectDataSource;{渺钡计沮琩高舱ン㎝计沮稰舱ンよ猭}
protected
procedure Execute; override;{磅︽絬祘よ猭}
public
constructor Create(Query: TQuery; DataSource: TDataSource); virtual; {絬祘篶硑竟}
end;
var
Form1: TForm1;
Q1, {絬祘琩高癸禜1 }
Q2,q3: TThreadQuery; {絬祘琩高癸禜2}
implementation
{$R *.dfm}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet:=FQuery;
end;
procedure TThreadQuery.Execute;
begin
try
FQuery.Open;
Synchronize(ConnectDataSource);{絬祘˙}
except
showmessage('Query Error');{絬祘钵盽}
end;
end;
constructor TThreadQuery.Create(Query: TQuery; DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;
procedure TForm1.FormCreate(Sender: TObject); {承怠砰承琩高癸禜}
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
//Q2 := TThreadQuery.Create(Query2, DataSource2);
Q3 := TThreadQuery.Create(Query3, DataSource3);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; {綪反ぇ玡沧ゎ絬祘磅︽}
Q1.Destroy;
//Q2.Terminate; {綪反ぇ玡沧ゎ絬祘磅︽}
//Q2.Destroy;
Q3.Terminate; {綪反ぇ玡沧ゎ絬祘磅︽}
Q3.Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject); {秨﹍絬祘,膥尿磅︽絬祘,本癬絬祘}
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
//if Q2.Suspended then Q2.Resume else Q2.Suspend;
if Q3.Suspended then Q3.Resume else Q3.Suspend;
end;
end.
Q1,连接oracle,如果是一个不存在的ip,则直到响应过来,Q3才显示数据。
Q3连接的本地的paradox.
既然是多线程,又是各自的session,不知道为何?