ADO与多线程(50分)

  • 主题发起人 jiangyiquan
  • 开始时间
因为临界区时间很短,所以出问题的机会很小,但是还是会出问题。
我在5个线程中各用一个ADOQuery连接同一个ADOConnection,
每个ADOQuery平均每秒钟激活一次查询,运行1、2个小时后就会出错。
后来改成每个ADOQuery连接各自的ADOConnection,就运行一天都没问题。
 
用Synchronize同步不会出错,但实际上是将线程中的处理切换到主线程中去,相当于单线程.
还是各用一个连接好
 
ADO如果用多线程的话是不是不用再放要在BDE中的TSession组件??
 
不用,TSession仅支持BDE
 
用多个adoconnection不会出错,
用一个不好说了
 
呵呵,要看你怎么用了:
>只是Thread中的所有对控件的操作要用 Synchronize 同步一下!
除非你不做并行query,否则,还多线程干吗?不是放到主线程执行了?
如果你是为了在后台执行QUERY,那么这样是对的。
如果你是为了并行处理QUERY,那么推荐还是用多个ADOConnection。
不过我几乎不用并行QUERY...
 
当然是一个线程一个TADOCONNECTION啦,除非是在ISAPI下,只要放一个就可以了
 
最好是并行,如果做好了很爽。
 
function TGetClientInfoThread.LoadClientInfo: boolean;
var
ADOConnection: TADOConnection;
ADOStoredProc: TADOStoredProc;
begin
ADOConnection := TADOConnection.Create(nil);
ADOStoredProc := TADOStoredProc.Create(nil);
try
ADOConnection.ConnectionString := FConnectionStr;
with ADOStoredProcdo
begin
ADOStoredProc.Connection := ADOConnection;
ProcedureName := 'upGetClientInfo';
with Parameters.AddParameterdo
begin
Name := '@ClientID';
Datatype := ftString;
Value := FClientID;
end;
Open;
..............

可是一开始执行,就发生了“olesyserror 标记没有引用存储”,what matter
 
在主线程初始化过程中,增加了uses comobj;

form.create...
begin
application.initialize;
//com初始化例程?那也作了,可是为什么还会报错呢
....
end;

 
每个adoquery都设置一个adoconnect ,是什么多线程呀?不懂.
 
一个ADOConnect连204个ADOQuery,那是用在单线程的,当然没有问题。因为同时只有一个ADOQuery再使用啊
如果用在多线程,不死才怪。而且是随机产生的。
多线程里,一个线程必须要一个ADOConnect。同一个线程里可以有多个ADOQuery。
这个是我的看法,这个问题我碰到过的。
 
来自:HORNEY, 时间:2001-5-26 1:28:00, ID:542560
当然是一个线程一个TADOCONNECTION啦,除非是在ISAPI下,只要放一个就可以了
請問HORNEY及各位同仁:
我在ISAPI下用線程,用多對ADOCONNECT,ADOQUERY實現並行QUERY
但是遇到這樣的問題,在TWEBACTIONITEM--BROWSE中進行QUERY,我想在線程結束后將得到
的DATA顯示在頁面上(Threaddone過程).可是卻ISAPI卻無法得知線程得結束並運行相應動作
我將代碼移植到普通得PROJECT中,Threaddone可以得到運行.不知道什麼原因.
PROCEDURE THREADONE(SENDER:TOBJECT);
.
.
procedure TWebModule1.WebModule1browseAction(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
.
.
try
with TSenderThread.Create(serverid,qlist,request.RemoteAddr,srvmessage)do
begin
OnTerminate := ThreadDone;
end;
except
end;
.
.
.
 
我做过这样的系统。
我认为两种方法都太极端,每个线程都创建一个ADOCONNECTION效率太低,而且数据库连接是个
缓慢的过程,当你的服务器程序和数据库不放在一起时更是如此。而所以线程连接一个ADOCONNECTION
确实会很不稳定。
所以我的作法是分析服务器要进行的服务,在服务器初始化时同时生成几个连接,然后让那些查询轮流
使用这些连接。
 
灰云的看法有道理,不过万一这么几个不够用怎么办?
还有,ADOConnection联上数据库不慢啊。如果没有特别的要求,我想是够了!
慢就慢在那个ADOTable上,数据库越在,就越慢。我现在都不用这个了
 
如果须要多个ADOCONNECTION,而我执行的是更新操作,如果更新失败,须要事务回滚,但该回滚
哪一个的ADOCONNECTION的呢?
 
没错,adotable很慢,打开大表令人不可忍受。最好不用。
 
放了很长时间,结了吧
 
顶部