多线程访问数据库的问题(100分)

  • 主题发起人 主题发起人 fortun
  • 开始时间 开始时间
F

fortun

Unregistered / Unconfirmed
GUEST, unregistred user!
我创建了两个线程mythread1,mythread2,其程序框架如下:
unit Unit2;
interface
uses
Classes,Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs,DB;
type
MyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
procedure MyPro1;
end;

implementation
procedure MyPro1;
begin
.....
end;
procedure MyThread.Execute;
begin
{ Place thread code here }
MyPro1;
end;

end.

以下是mythread2单元
unit Unit3;
interface
uses
Classes,Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs,DB;
type
MyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
procedure MyPro2;
end;

implementation
procedure MyPro2;
begin
.....
end;
procedure MyThread.Execute;
begin
{ Place thread code here }
MyPro2;
end;

end.

MyPro1由远程服务器获取数据后写入本地数据库
MyPro2是对本地数据库进行操作。由于MyPro1和MyPro2都要对本地数据库进行操作
所以会引起访问冲突的问题。
请教各位如何避免访问数据库冲突啊。我刚开始使用线程,可以说是摸着石头过河。
最好说的详细一点。分数不够可以再加。
谢谢了[:)]
 
到D4的例程目录下有一个多线程的例子。
 
DFW上的各位大侠都跑到哪去了?
拜托了
 
用上session吧,,,[:)] 还搞不定的话,我发个例子给你...
 
写在sync中
 
Synchronize causes the call specified by Method to be executed using the main
VCL thread, thereby avoiding multi-thread conflicts. If you are unsure whether
a method call is thread-safe, call it from within the main VCL thread by
passing it to the Synchronize method.
This example shows how to call a button抯 click method in a thread-safe manner:
procedure TMyThread.PushTheButton;
begin
Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
Synchronize(PushTheButton);
...
end;

另外,如果你本地用了SQLServer之类的软件,由于其内部机制一般不会有问题。
希望上面的内容对你有所帮助。
 
我是用了TSESSION了,
每个线程用了一个Tsession,一个Tdatabase几个Ttable
我把这些控件集中在一个TDataModul中(包括Tsession,Tdatabase,和TABLE)
Tsession。autosessionname:=false
补充一下。其中一个Tsession连了两个Tdatabase,一个Tdatabase是连接远程服务器上的数据库
另外一个Tdatabase连接本地数据库
这样有问题吗?forss,
MAIL:gdxy@263.net
谢谢了!!
 
fortun:
两个库不要指向同一个SESSION,多个QUERY指向同一个SESSION进行多线程查询是
肯定没问题的,而且两个库所进行的数据操作应该是分开来的....不知道你的具体要求有那
些呢?
 
forss:
Tsession连接了两个Tdatabase,一个Tdatabase是连接远程服务器上的数据库,只用了一个query
另外一个Tdatabase连接的是本地的数据库表,有8个TABLE。具体的要求是将服务器上的数据
每隔一段时间取过来然后写入本地数据库中去。这个操作是在一个线程中完成的。
你看有什么不妥当的地方吗?
请指教!!
 
那好像一个线程就可以了吧,,而且好像和table没关系呀,用一个query取得数据后
在用另外一个query写到本地库,放一个时钟间隔的执行此线程就可以了吧.
 
我给你说的这些操作就是在一个线程中完成的
还有其他的线程是连到本地库的,在别的线程中要进行一系列的读写等操作。
这样在写时就会发生冲突了。是说表is locked by another user。
 
线程中用vcl控件一定要用Synchronize,用Synchronize就没问题了。
 
我觉得使用session麻烦,直接使用tdatabase控件,session让它去解决。
这样每启动一个线程,就是一个独立的session
 
但是从一本书上我看到说每个线程最好有一个TSESSION控件
还有,我没有用VCL控件。当然我试过SYNCHRONIZE方法。但是我始终感觉用这个方法
效率不是太高
 
fortun的问题和VCL资源是没有关系的,Synchronize只是VCL的保护模式,
如果没有进行屏幕的重画的话,用了Synchronize会使你的线程变的非常慢。
DELPHI5开发人员指南中有详细的介绍。
fortun:
可否告知你所要进行的数据读写操作的是哪些表。以及这些表间的关系?
好让我帮你试一下。。?
 
回forss:
我本地数据库是8个表。他们之间没有联系,是各自独立的
线程一:一个TSESSION,两个TDATABASE,一个TDATABASE连接远程服务器,采用了一个QUERY
两外一个TDATABASE连接本地库。有8个TABLE与这个TDATABASE相连,要对这8个表进行写
操作;
线程二:一个TSESSION,一个TDATABASE,有8个TABLE与TDATABASE相连,通过计算等后也要对‘
8个表进行写操作;
其实应该是很简单的。但是不知道怎么搞的,就是会发生访问冲突。
谢谢!
 
我觉得把数据库连接部件放在线程内动态创建比较好。
望大家指正!
 
我觉得可以用ADO控件啊,那是线程安全的
 
那这两个线程是同时进行的?
还是说由第一个线程取得数据,
后再由第二个线程进行计算写入?
 
第一个线程取得数据后写入本地
第二个线程利用第一个线程取得的数据进行计算,将计算结果写入本地。
想设计成第一个线程执行完后立即执行第二个线程。
我的程序框架在一开始我已经帖出来了。
(补充一下,每个线程的EXECUTE里面,在MyPro前面都有一句freeonterminate:=true)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部