我刚刚跳过其他人写的一个看起来效率不高的功能,但是我对JPA的了解并不是很好找到一个不是Hibernate特定的可移植解决方案.
简而言之,在一个循环内调用的Dao方法插入每个新实体都会执行"entityManager.merge(object);".
是不是在JPA规范中定义了一种方法来将实体列表传递给Dao方法并执行批量/批量插入而不是为每个对象调用merge?
此外,由于Dao方法带有"@Transactional"注释,我想知道每个合并调用是否在自己的事务中发生......这对性能没有帮助.
任何的想法?
没有在vanilla JPA中没有批量插入操作.
是的,每个插入都将在自己的事务中完成.的@Transactional
属性(无限定符)指的传播电平REQUIRED
(如果它不存在的话创建事务).假设你有:
public class Dao {
@Transactional
public void insert(SomeEntity entity) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
你做这个:
public class Batch {
private Dao dao;
@Transactional
public void insert(List<SomeEntity> entities) {
for (SomeEntity entity : entities) {
dao.insert(entity);
}
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,整个插入组就会被包装在一个事务中.如果您正在谈论大量插入,您可能希望将其拆分为1000,10000或其他任何组合,因为足够大的未提交事务可能会使数据库资源匮乏,并且可能由于大小而单独失败.
注意: @Transactional
是一个Spring注释.请参阅Spring Reference中的事务管理.
归档时间: |
|
查看次数: |
8583 次 |
最近记录: |