【问题标题】:Multiple threads writing into single database table多个线程写入单个数据库表
【发布时间】:2016-02-23 21:27:16
【问题描述】:

我遇到了使用休眠将多个线程插入数据库中的单个表的问题。每个线程都会生成一些数据,然后将它们插入到表中。问题是由于数据库锁,插入仅由 1 个线程处理。什么是最好的解决方法,所以线程可以同时插入?我试图让 1 个专用线程写入表,其他线程将生成数据。但是数据的生成速度比插入快得多,所以它不能解决我的问题。

我唯一的想法是为每个线程创建自己的数据库/表,但这对我来说似乎有点奇怪,因为我不知道我将提前创建多少个线程。有没有更好的解决方案?

【问题讨论】:

  • 可能是交易。因为如果您插入一点点,那么无论线程如何,您每秒的事务量都会被限制在惊人的低水平。如果将数据捆绑到更大的事务中,则会增加吞吐量,因为每秒事务限制并不关心事务的大小。 docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html 更多线程意味着更多争用,这意味着性能下降
  • 将数据库更改为 Oracle,它会为每个线程创建重做日志并写入它。
  • 如果您生成的数据太快以至于无法正确设置数据库来处理(这意味着您已经适当地调整了硬件和日志,并且您只使用了 READ COMMITTED),那么 SQL几乎可以肯定不是合适的数据存储。

标签: java mysql database multithreading hibernate


【解决方案1】:

您必须保留一个队列以保留要插入的数据。所以所有处理线程都可以将数据插入队列。一旦您的插入线程将数据插入数据库,您就可以将其从队列中删除。

【讨论】:

  • 你错过了the data is generated way faster then inserted,所以即使没有代码,这条评论也不能解决问题。
  • @nikpon 我没有像你说的那样错过它。这就是为什么我建议在插入数据库之前使用队列来处理生成的数据。
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多