多线程添加数据,如何去重

数据来源是某网站上的公开数据,而且不排除这些数据会不定时更新...不过由于数据量比较大,所以我就想用多线程添加进数据库. 但是在入库的时候发现数据出现大量重复:我当时开了4个线程,最后存入数据库的数据量就是标准的4倍之多,也就是单个线程他已经把全部数据都取下来了. 但如果不用多线程的话,执行效率着实有点低. 有什么办法能在数据进入数据库之前就去重吗? 毕竟我不想对数据库做什么改动,而且数据库的效率有点低...

图片说明

还有就是数据源是按页取出的,我在想有什么方法能让每个线程在执行"取数据"之前来获知自己该去取第几页的...

性能开销在网络上不在内存和cpu
所以你将抓取的数据放入hashtable等,共享一个集合,统一写入数据库。

你可以根据数据源的分页来取,比如URL中有一个参数等来标识第几页,这样就可以不同的线程去访问不同的页面,参数不一样。这样拿到的数据就不会重复,然后再各自插入数据库、
这样的逻辑还可以多进程来做。进一步提高性能

楼上的思路不错,共享一个集合,统一写入数据库。

不同线程分页采集也能有效减少重复;

如果你的线程采集速度足够快,不考虑网络、数据库等开销,可以为数据库添加一个varchar(32)的唯一列,值为要插入内容的MD5,
这样重复的内容就无法入库了。也可以声明一个全局的Map,保存已经入库的MD5,这样发现Map中已经存在就不需要执行入库操作,
没有就添加到Map中并执行入库操作;

  1. 不同线程分页采集,保存在数据库中表A。
  2. 将表A去重,保存到表B。

这样可以保存原始数据以备以后使用。