使用线程插入mysql

Posted

技术标签:

【中文标题】使用线程插入mysql【英文标题】:insertion in mysql using threads 【发布时间】:2013-09-16 03:37:07 【问题描述】:

我是线程新手,对 Java 知之甚少 我在 mysql 中插入数据时遇到了一些严重的性能问题。数据是巨大的块并且需要大量的时间,即使是使用批处理准备好的语句。

我想从哈希表中读取键和值,并使用线程划分要插入到 mysql 表中的特定 say-5 索引。我认为这会提高我的表现。 假设有 100 个索引;所以我想创建 5 个线程,每个线程在数据库中插入 20 个值。 我可以创建一个线程数组并将它们传递给执行程序池并提交,但是我被困在之后如何继续进行。

我有以下疑问: 我如何跟踪线程插入了多少或如何限制线程插入 20 个? 我可以进一步将每个线程的 20 个插入工作分成 4 个批次吗?

我不是在寻找代码,而是在寻找可能有帮助的正确指导。

【问题讨论】:

使用ExecutorService同时处理多个线程。在线教程中有一个很好的解释,这里有一个例子:vogella.com/articles/JavaConcurrency/article.html#threadpools “我是线程新手” - 所以不要。 @MitchWheat 不要什么? 线程!数据插入速度比 CPU 更可能受 I/O 限制。奇怪的是,引入线程将导致零加速。 @MitchWheat 您是否使用分析器对此进行了测试,以真正说即使使用数据库连接池的优势,多线程也无济于事? 【参考方案1】:

我个人会使用Executor API。

基本上,我会创建一个固定池执行器,只需将您要执行的任务提交给它,并允许它在现有线程可用时管理任务池。

查看Executors tutorial了解更多详情

【讨论】:

@MadProgrammer - 我会试试这个。另外,如何限制哈希表中的索引数量? 我可能不会。我会简单地创建有数字的“插入任务”的数量并将它们提交给执行程序,并允许它管理在线程可用时将它们分发给线程...... @MadProgrammer - 可能,创建linkedhashmap 代替hashmap 可以帮助我跟踪位置并从该特定位置插入mysql。如果我错了,请纠正我。

以上是关于使用线程插入mysql的主要内容,如果未能解决你的问题,请参考以下文章

使用twisted将mysql插入变成异步执行

你向 MySQL数据库插入 100w 条数据用了多久?

你向 MySQL 数据库插入 100w 条数据用了多久?

MySql - 使用连接子查询插入多行?

mysql数据库批量高速插入

MySQL获取刚插入的数据