多线程连接数据库问题。

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,不知道为何?
...全文
288 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanbor 2012-09-18
  • 打赏
  • 举报
回复
我在线程中这样的:
TConnThread = class(TThread)
conLocal: TADOConnection;
conRemote: TADOConnection;
bConnected: Boolean;
private
...
end;
没有你说的问题。
haitao 2012-09-16
  • 打赏
  • 举报
回复
如果子线程操作界面的vcl,则还是无法并发的
sgjie 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
跟踪线程中的实现代码,检查不是有用到Synchronize这样的代码或者功能相似的地方。多线程了还导致界面死掉,一般都是Synchronize的问题,二个是CPU真的不够用,三个是消息链被破坏。
[/Quote]
多线程了 界面不是死掉,只是 一直等到Q1连接不上出错提示后 Q3才显示出来。
Q3连接的是本地的数据库,不知道为何等Q1执行完毕才显示?

另外我把 Synchronize(ConnectDataSource); 注释掉,还是照常。
yangyxd 2012-09-15
  • 打赏
  • 举报
回复
跟踪线程中的实现代码,检查不是有用到Synchronize这样的代码或者功能相似的地方。多线程了还导致界面死掉,一般都是Synchronize的问题,二个是CPU真的不够用,三个是消息链被破坏。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧