我在定时器里每隔5分钟从这边数据库读取4万多的数据,通过循环到另一个库中相应的表里作更新。结果程序总是无响应,卡死。有没什么好的方法可以解决这样的问题?

解决方案 »

  1.   

    两个库在同一个服务器上,用SQL实现同步是否可以?
      

  2.   

    每处理完一条数据,执行一步:
    Application.ProcessMessages;
      

  3.   

    请楼主到SQLSERVER版问问有没有好方法。D版一般会建议你用线程,用几个线程分段处理自动的业务。
      

  4.   

    看下置顶的帖子
    http://bbs.csdn.net/topics/360046056
      

  5.   

    1、确认是否需要操作那么多的数据。数据量大时,对每条记录设置时间戳,每次只计算新修改的数据,可以减少数据量。
    2、遍历4万条记录,如果用 ADO ,5分钟可能是不够的,用DBX吧,遍历速度快不少。
    3、插入速度。因为插入数据时可能需要扩充表空间,所以有时数据库操作会突然停顿的,这个写程序时应该考虑到,保障上次操作未完成,不进行新的操作,这样不至于产生锁的问题,也减轻服务器压力。插入时,使用事务批量插入,一般速度会快些。
    4、如果是SQL服务器忙不过来时,增加线程只是让服务器更忙。没办法完成得更快一些。
      

  6.   

    使用线程就可以了。起一个线程就行了。只要当前线程结束,才进行下一轮的同步。而且定时器也是这样,应该是开始同步的时候就停止计时器,当同步完成的时候在启动定时器。这样就避免当前还没完成,下一轮又启动了。如果是做同步,最好是用增量的方法去做,把要同步的表都写新增,修改,删除的触发器到一个同步表中。同步表中只有几个字段(主键,同步表名,同步表主键字段名,同步表主键字段值,操作类型(I,U,D),时间),有这几个字段就足够,然后你的程序直接扫描这个表,根据表名主键字段和字段值进行增量同步即可。
      

  7.   

    我给写了个线程处理,5分钟的时间好像还不够。下面是线程代码
    var
      ssql,vehiid:string;
    begin
      While ( Not self.Terminated ) Do
      begin
        Try
          if isTerminated then
            break;
          with DataModule1.mdtstatusqry do
          begin
            if mdtstatuscount=0 then  //没有记录退出
            begin
              inbdmdtstatus.isTerminated:=true;
              inbdmdtstatus.Free;
              exit;
            end;
            while not eof do
            begin
              inc(inthreadindex);
              //插入表代码//
                 ........
              //插入表代码//          if inthreadindex=1000 then
              begin
                break;
              end;
              next;
            end;        if RecNo=mdtstatuscount then//处理完结束进程退出
            begin
              inbdmdtstatus.isTerminated:=true;
              inbdmdtstatus.Free;
              exit;
            end;      end;
          sleep(500);
        except
        end;    
      end;{ Place thread code here }
    end;
      

  8.   

    oracle 数据库你可以尝试用DBLINK在两个数据库直接建立一个连接,然后创建JOB,通过SQL的方式来进行操作,这样好点,你用程序做,需要把数据查到你本地,然后再有你本地传到数据库就会慢了很多
      

  9.   

    楼上才是正解。如果两个数据库,不管是不是一个计算机上,只要可以相互访问,就可以创建作业由数据库来处理他们之间的数据,mssql如此,oracle也如此。
      

  10.   

    根据取得的数据,生成一个5万条update语句的大sql,
    调用数据库对应的isql或osql等命令行工具去执行这个sql文件
      

  11.   

    +1。
    LZ的插入记录代码可以优化下,4W条数据,5分钟怎么可能处理不完。我看你代码是循环逐条插入,这是最慢的,按楼上的方法,可以快很多,也可以查下数据库关于插入记录速度优化的帮助。(MySQL逐条插入10W条数据得30分钟以上,用批量插入3分钟不到,用Load file方式,2分钟不到)
      

  12.   

    程序无响应的问题,可以每1000条数据形成SQL,执行ExecSQL,再执行Application.ProcessMessages;同时在进度条上显示进度
      

  13.   

    直接在SQL server上解决这个问题,做一个触发器,如果发现 添加,删除,修改的操作,就触发这个事件