我正在使用 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/