2013-02-27 89 views
0

根据我上面的问题,我需要在我的数据库的一个表中插入超过20000行。根据表现,我正在寻找一种方法来提高这一过程的效率。我的第一个想法是用Java.Thread实现这一点,但我不太确定这是否足够节省。有没有人对我有好的建议?使用Java.Thread将数据插入MySQL数据库是否安全?

编辑:我已经使用preparedStatement.addBatch()

+0

我不关于多线程,但你可以检查了这一点:http://stackoverflow.com/questions/7195665/java-jdbc-multiple-prepared-statement-bulk-insert – Aashray 2013-02-27 09:14:00

+0

你可以使用存储过程和调用它来自你的java代码。 – Biswajit 2013-02-27 09:17:28

回答

1

看起来安全对我来说,只要每个线程使用不同的连接对象,然后适当的资源的处置。

无论如何,请注意数据库本身对同时运行的请求(MySQL中的max_connections)有限制,所以它不会帮助创建比此数字更多的线程。另外,请考虑其他优化,例如batch inserts

1

从不同线程访问数据库没有任何问题。正如Eyal所写,只要确保像Connections这样的东西只能用于单个线程并妥善处置。

另一个问题是,如果这实际上会帮助你的表现。在使用多个线程之前,我会确保你做了所有其他的事情。特别是使用批处理语句似乎是第一个选项,如果你还没有。

+0

我正在对批处理和线程的组合进行基准测试。是否有可能将整批(例如2000行)推入数据库,或者是否已经通过调用'preparedStatement.executeBatch()'完成了这一操作?对于〜8000行的一个大批次,为 – commandcraxx 2013-02-27 10:01:37

+0

〜10分钟。 〜10分钟,10个螺纹和10个小批量。我认为这应该可以提高性能。 – commandcraxx 2013-02-27 10:08:45

+0

我看到的问题是同步线程。所以我得到了不一致的数据插入,如果我使用多个线程... – commandcraxx 2013-02-27 11:07:54

0

如果我理解正确,您需要一种方法将数千个查询写入您的数据库。 你知道你可以执行一批MySQL查询吗? 有关于这已经#2问题, Java: Insert multiple rows into MySQL with PreparedStatement

你可以使用:)) http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29

退房@BalusC的PreparedStatement的#addBatch(http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#addBatch%28%29

和 的PreparedStatement#则ExecuteBatch(在上面的链接中回答更多的细节。

+0

看到我下面的评论。是的,我已经使用批处理。对不起,我忘了写下我的问题。 – commandcraxx 2013-02-27 10:09:49

0

“20000000”听起来不像(以数据库维度)开头。

在通过多线程增加复杂性之前,最好先探讨预处理语句和批处理语句的可能性。

这取决于您的特定类型的数据库,但大多数RDBMS具有允许执行此类任务的批量加载程序。

如果您想添加一些信息(数据库类型,记录长度,数据库是否与应用程序在单独的计算机上运行,​​并且它是否具有足够的处理能力来处理多个高压线程,而不会严重拖延这个原因)人们可能会更好地帮助。