【问题标题】:Is it safe to Insert data in MySQL database using Java.Thread?使用 Java.Thread 在 MySQL 数据库中插入数据是否安全?
【发布时间】:2013-02-27 09:10:14
【问题描述】:

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

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

【问题讨论】:

标签: java mysql multithreading


【解决方案1】:

对我来说看起来很安全,前提是每个线程都使用不同的 Connection 对象,然后正确处理资源。

无论如何,请注意,数据库本身对并发运行的请求有限制(MySQL 中的max_connections),因此它无助于创建比此数量更多的线程。另外,请考虑其他优化,例如batch inserts

【讨论】:

    【解决方案2】:

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

    另一个问题是,这是否真的有助于你的表现。我会确保您在使用多个线程之前完成了其他所有操作。特别是使用批处理语句似乎是您尚未研究的第一个选项。

    【讨论】:

    • 我正在对批处理和线程的组合进行基准测试。是否有可能将整个批次(例如 2000 行)推送到数据库中,或者这是否已经通过调用 preparedStatement.executeBatch() 完成?
    • 约 10 分钟,大批量约 8000 行。约 7.5 分钟,有 10 个线程和 10 个小批量。我认为这应该可以提高性能。
    • 我看到的问题是同步线程。因此,如果我使用多个线程,则会出现数据插入不一致...
    • 嗯..“并发很难”这就是为什么我建议先检查其他所有内容。
    【解决方案3】:

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

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

    和 PreparedStatement#executeBatch() http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#executeBatch%28%29

    查看以上链接中@BalusC 的答案了解更多详情。

    【讨论】:

    • 请参阅下面的评论。是的,我已经使用批处理。对不起,我忘了把它写在我的问题中。
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多