我目前正在做一个Java项目,我需要准备一个大的(对我来说) mysql数据库。我必须使用Jsoup进行web抓取,并将结果存储到我的数据库中。据我估计,我将插入大约1,500,000到2,000,000条记录。在我的第一次试验中,我只是使用循环来插入这些记录,我花了一周的时间来插入大约1/3的所需记录,我认为这太慢了。有没有可能让这个过程多线程,这样我就可以将我的记录分成3个集合,比如每个集合500,000条记录,然后将它们插入到一个数据库中(特别是一个表)?
发布于 2012-03-12 17:55:44
在这里,多线程不会对你有所帮助。您只需将争用瓶颈从应用程序服务器转移到数据库即可。
取而代之的是,尝试使用批插入,它们通常会使这类操作快上几个数量级。参见"3.4 Making Batch Updates" in the JDBC tutorial。
编辑:正如@Jon评论的那样,你需要将网页的获取与它们插入数据库的过程解耦,否则整个过程将以最慢的速度进行。您可以让多个线程获取网页,这些线程将数据添加到队列数据结构中,然后让单个线程使用批插入将队列排出到数据库中。
发布于 2012-03-12 17:56:10
只要确保两个(或更多)线程不会同时使用同一个连接,使用连接池就可以解决这个问题。c3po和apache dbcp浮现在脑海中...
发布于 2012-03-12 17:56:33
您可以将记录集分成多个批,然后执行此操作,但也许您还应该考虑其他因素。
您是否正在为每个插入进行网络往返?如果是,延迟可能是真正的敌人。尝试对这些请求进行批处理以减少网络流量。
您是否启用了事务处理?如果是,则回滚日志的大小可能是问题所在。
我建议分析应用程序服务器和数据库服务器,看看时间都花在哪里了。你可以浪费很多时间去猜测根本原因。
https://stackoverflow.com/questions/9664821
复制相似问题