解决方案 »

  1.   

    首先,执行插入语句的时候可以采用批处理的方式一批一批的执行
    第二,不要频繁开启关闭数据库连接,可以采用一些成熟的jdbc连接池
    第三,如果内存足够充裕,可以考虑对查询过的数据进行本地缓存,减少数据库IO
      

  2.   

    执行插入语句就是批处理进行的,关于第二点我得根据每条数据查询数据库是否存在,就有了频繁开启关闭数据库连接,是不是有可能导致速度慢?第三点,我查询过的数据要么就过滤掉了,要么就录入数据库或更新数据库,都放到一个list中了,然后进行了批处理,
      

  3.   

    执行插入语句就是批处理进行的,关于第二点我得根据每条数据查询数据库是否存在,就有了频繁开启关闭数据库连接,是不是有可能导致速度慢?第三点,我查询过的数据要么就过滤掉了,要么就录入数据库或更新数据库,都放到一个list中了,然后进行了批处理,
    第二点是这样的,如果需要频繁开启关闭连接,请用连接池
    第三点我说的缓存的意思是指如果一条数据查询过了,那么就把它放在本地缓存,下一次先在内存查找,如果内存里有一样的,就不用再去数据库里找了
      

  4.   

    解析文件和更新数据库都不慢,就是对比存在与否有点慢了,期间经过频繁的开启关闭数据库连接
    对比慢可以考虑使用md5,把所有字段都值都组成一个字符串,比如:I字段1_字段2,根据这个串取md5,放到一个字段内,对这个字段建立索引,对比存在时可以查询这个字段来区分。数据库连接好办,不管是普通连接,或者数据源,一个文件或者批次使用一个连接就行了。
      

  5.   

    执行插入语句就是批处理进行的,关于第二点我得根据每条数据查询数据库是否存在,就有了频繁开启关闭数据库连接,是不是有可能导致速度慢?第三点,我查询过的数据要么就过滤掉了,要么就录入数据库或更新数据库,都放到一个list中了,然后进行了批处理,
    第二点是这样的,如果需要频繁开启关闭连接,请用连接池
    第三点我说的缓存的意思是指如果一条数据查询过了,那么就把它放在本地缓存,下一次先在内存查找,如果内存里有一样的,就不用再去数据库里找了
    关于第二点,我研究下,关于第三点我查询了一条数据之后,就不会再用到这条数据了再查询数据库了,非常感谢,不过对连接池这一块得研究一下
      

  6.   

    解析文件和更新数据库都不慢,就是对比存在与否有点慢了,期间经过频繁的开启关闭数据库连接
    对比慢可以考虑使用md5,把所有字段都值都组成一个字符串,比如:I字段1_字段2,根据这个串取md5,放到一个字段内,对这个字段建立索引,对比存在时可以查询这个字段来区分。数据库连接好办,不管是普通连接,或者数据源,一个文件或者批次使用一个连接就行了。
    时间慢的问题主要在数据库这方面,非常感谢你的回答
      

  7.   

    如果是更新录入数据到表B, 是否可以考虑将全部数据先插入一个表A中, 然后拿表A与表B进行联合查询, 不存在的插入, 存在且数据有变化的更新, 在清除表A数据. 这样的话先将数据快速批量插入数据库之后, 只需执行更新和插入, 就不用频繁的查询比较了. 
      

  8.   

    把csv 里的数据存放到一张新表中  ,  利用sql 去比较 不知行否   
      

  9.   

    不能做临时表,那注定很伤,
    做个for循环逐笔核对导入和5000一导应该没分别吧,
      

  10.   

    解析文件和更新数据库都不慢,就是对比存在与否有点慢了,期间经过频繁的开启关闭数据库连接
    对比慢可以考虑使用md5,把所有字段都值都组成一个字符串,比如:I字段1_字段2,根据这个串取md5,放到一个字段内,对这个字段建立索引,对比存在时可以查询这个字段来区分。数据库连接好办,不管是普通连接,或者数据源,一个文件或者批次使用一个连接就行了。这是个好主意,而且如果在把md5值结合缓存的话,可能效率更高。
      

  11.   

    楼主 可以这样,对每一条记录进行 hash 校验,不用md5, 每次插入数据的时候 检查一下 此记录的hash 是否存在,如果存在就丢弃,否则就插入。用一个hash map来记录 hash 
      

  12.   

    用HashMap保存容易造成机器内存不够用,感觉还是放缓存好点。
      

  13.   

    和我所维护的系统的batch处理方式一模一样。我们系统现在是csv35万条数据,也是遇到了处理速度的瓶颈,我是ERP。上个月进行过一次简单优化。对您的问题有以下见解:①根本没必要查询数据是否存在(浪费大量时间),直接做更新,如果更新结果为0条,考虑insert,这样基本不会有什么处理时间花销。更高性能可考虑merge。②建临时表是很好的解决方案,不知你们为什么不允许,反正我们允许,效果也很好
      

  14.   

    如果是mysql可以设置innodb_flush_log_at_trx_commit的值
      

  15.   

    这个,我现在也在做导入,不过是从EXCEL导入需要判断几个字段的数据是否存在,比如员工啊,地区啊之类的,散在好几个表里我现在是先把表的数据提到后台,后台验证后以后UPDATE和insert,正如楼上所说的,会出现内存问题,做FOR循环连接数据库验证确实很慢也很头疼
      

  16.   

    楼主说问题主要在比较,以下是sqlserver中的一个比较插入      INSERT INTO [dbo].[A]
               ([F1]
               ,[F2])
          select [F1]
               ,[F2]
               from  [dbo].B
               where (select count(1) as num from [dbo].[A] where A.F1= B.F1
               ) = 0  
    效率还是可以,您可以试试,再者,批量插入临时表要一次写入更多的数据5000条太少,如果服务器够好,可以不能考虑分批