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

解决方案 »

  1.   

    如果数据结构没什么大的变化,最好想办法批量导出导入处理好。如果非要用线程单条单条插入,下面是个思路type
      TFieldabc = record
        Field1:string;
        Field2: string;   
        //...                                     
      end;
      ...maxthreadcount=5var
    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;
      

  2.   

    谢谢dragonki(dragonki),能否发一个较完整的例子给我~~谢谢~~
      

  3.   

    TO withcsharp() :
      数据库A是Sybase,数据库B是Oracle,不支持异构数据库同步~~
      

  4.   

    TO dragonki:
      QQ号是好多,能加QQ详聊吗??
      

  5.   

    unit Unit1;interfaceuses
      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.
      

  6.   

    谢谢liangpei2008~~
    感觉dragonki的方法才能达到要求~~
    自己再顶一下~~
    希望dragonki能帮忙
      

  7.   

    ADO 本来就支持 异步 
    你可以用 ado 异步 fetch模式
      

  8.   

    好的,谢谢dragonki~结帖了
    withcsharp,能留个QQ号吗?详细聊聊异步同步~~
      

  9.   

    准备结帖了,withcsharp,我的QQ是67030990~