首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

100分求多线程查询数据库的例子,该如何解决

2012-02-26 
100分求多线程查询数据库的例子我在写一接口程序,分别连接A,B两个数据库,要将数据库A中Table1表的数据转移

100分求多线程查询数据库的例子
我在写一接口程序,分别连接A,B两个数据库,要将数据库A中Table1表的数据转移到数据库B中的Table2中,并完成相应的统计计算,但Table1中的数据量比较大,按天来取大概有10W条,所以我想用多线程的方式来实现,比如说Table1中有5W条数据,我同时开5个线程,并发处理,请教各位有没有相似的例子,我的邮件hldyk@126.com,收到例子马上结贴,谢谢.

[解决办法]
如果数据结构没什么大的变化,最好想办法批量导出导入处理好。

如果非要用线程单条单条插入,下面是个思路

type
TFieldabc = record
Field1:string;
Field2: string;
//...
end;


...

maxthreadcount=5

var
abc:TFieldabc;
threadcount:integer;


begin
//自己打开读取table1
while not adoquery1.eof do
begin
//把记录读取到 abc 中

while (ThreadCount > = MaxThreadCount)
do
begin
if (Stop_flag = true) then //stop_flag 是中断标识
break;
Application.ProcessMessages();
Sleep(1);
end;

if (Stop_flag = true) then break;
TInstTable2.Create(false, abc);
//TInstTable2是插入table2线程 注意线程生成时 threadcount +1 ,线程结束时 threadcount -1 就行了


adoquery1.next;
end;

end;
[解决办法]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,ActiveX;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOConnection2: TADOConnection;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TADOQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query: TADOQuery;
DataSource: TDataSource); virtual; { 线程构造器 }
end;


var
Form1: TForm1;
Q1,Q2:TThreadQuery;
implementation

{$R *.dfm}


procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
Try
try//加
CoInitialize(nil);//加

FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }

finally//加
CoUninitialize;//加
end;//加

except
ShowMessage( 'Query Error '); { 线程异常 }
end;

end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TADOQuery; DataSource: TDataSource);
begin
FQuery := Query;
coInitialize(nil);
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(ADOQuery1, DataSource1);

Q2 := TThreadQuery.Create(ADOQuery2, DataSource2);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate; { 销毁之前终止线程执行 }
Q2.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;
end;

end.

[解决办法]
ADO 本来就支持 异步
你可以用 ado 异步 fetch模式

热点排行