java - 如何使用多线程按顺序将对象 block 持久保存在数据库中?

标签 java multithreading hibernate

我正在使用 Hibernate、Maven 项目和 JBoss AS7。我有一个选择请求,它为我提供了一个对象列表(假设我有 100000 个客户端),我想将它们保留在一个新表中。如果我尝试直接执行此操作,那么我使用的 JBoss 服务器将给出著名的错误: timeout

我正在考虑是否可以通过使用多线程来做到这一点。

...
entityManager.getTransaction().begin();
  for(Client client:ListClients{
    entityManager.persist(client);
   }
    entityManager.getTransaction().commit();
...

最佳答案

多线程在这里是错误的方向,如果您希望插入按特定顺序进行,则更是如此。您可以以 1000 个左右的 block 来处理实体,单独提交每个 block ,并定期刷新或使用无状态 Hibernate session ,以保持第一级缓存大小较小。 Hibernate 文档有 chapter on batch processing .

如果这是数据库中已有的数据,那么使用直接在数据库上运行的存储过程或脚本来执行此操作可能会更好。要将数据导入数据库,请检查数据库附带的批量复制工具并使用它。批量复制工具可以暂时解除数据库约束并暂停重建索引,而且网络协议(protocol)不像JDBC那样繁琐,会快很多。

关于java - 如何使用多线程按顺序将对象 block 持久保存在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29702635/

相关文章:

hibernate - HQL 中带有嵌套 select 的 Case 语句

java - org.hibernate.StaleStateException : Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

java - ActionListener 是 java 中的线程吗?

java - Swing 文本 API : Override LabelView with different string length?

java - Spring 安全登录404

.net - 如何在自定义类型中实现 Control.Invoke 模拟?

c# - 在 C# 控制台应用程序中使用线程概念并行执行超过 2 个 Dtsx 包

java - 基于时间的轮换

multithreading - perl 模块 Perl-LDAP (Net::LDAP) 是线程安全的吗?

java - thymeleaf 值到 html 选择输入