【问题标题】:Concurrent multithreaded Bulk data inserts/updates to Mysql并发多线程批量数据插入/更新到 Mysql
【发布时间】:2014-12-22 14:03:39
【问题描述】:

我的多线程(大约 10 个线程)应用程序的多个实例在不同的机器(大约 10 台机器)上运行。所以这个应用程序的总共 100 个线程同时处于活动状态。 这些线程中的每一个都产生 4 个输出集,每个集包含 1k-5k 行。这些集合中的每一个都被推送到单个 Mysql 机器、相同的数据库、相同的表(插入或更新操作)。所以有 4 个表消耗每个线程产生的 4 个集合。 我正在使用 mybatis 作为 ORM。与处理请求相比,这些线程在将输出写入 DB 时可能会消耗大量时间。 在这种情况下如何优化数据库写入? 1.使用mybatis的批处理 2. 将数据写入将由单个消费者线程拾取并写入数据库的文件? 3. 将每个数据集写入不同的文件并使用 4 个消费者线程从同一个数据集中挑选必须推送到同一个表的数据,从而最大限度地减少锁定? 如果可能,请提出其他更好的方法?

【问题讨论】:

    标签: java mysql multithreading parallel-processing mybatis


    【解决方案1】:

    数据库是用来处理并发的。不确定 mybatis 到底带来了什么(一般不是 ORM 的忠实粉丝),但如果它正在使用它,那会让你开始考虑像中间文件和单线程更新这样的黑客攻击,你可能会更好地翻录将其输出并使用普通 jdbc 写入 db,如果您对更新进行了充分的批处理,那么处理您的用例应该没有问题。

    【讨论】:

    • 您能否详细说明正确批量更新是什么意思。
    • 我的意思是如果一个线程每秒更新 50 行,或者如果它在短时间内多次更新同一行,那么你应该累积这些更新,而不是让每次需要更新一行时都会调用一个单独的 sql,这听起来像是您正在做的事情,因为您的数据库更新比数据处理花费的时间更多。还要检查您的架构是否效率低下。您的更新需要这么长时间是非常可疑的。你在使用连接池吗?你应该。检查它的配置。
    • 谢谢。我正在使用来自每个线程的单独数据库连接。有没有更好的方法来处理连接?又是一个天真的疑问,如果连接数不会超过 200-500,那么连接池是否重要?
    • 只要保持连接打开,并且不要在每次与数据库通信时重新创建它,就可以了。
    猜你喜欢
    • 2011-09-11
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多