java - JPA在多个事务中插入行,限制单个事务中的最大行数
问题描述
我想在单独的事务中插入每 1000 行。因此,如果有 3000 行,则应将其插入 3 个不同的事务中。我不使用弹簧。
import com.company.UserDAO;
import javax.inject.Inject;
import javax.transaction.Transactional;
public class Round{
UserDAO userDao;
@Inject
public Round(UserDAO userDao){
this.userDao = userDao;
}
@Transactional
@Scheduled(every = "10s")
void schedule() {
Synchronization synchronization = new Synchronization();
synchronization.setUserDAO( userDao );
synchronization.synchronize();
}
}
public class Synchronization{
UserDAO userDao;
public void synchronize(){
List<User> newUsers = Arrays.asList( new User(a1), new User(a2), ..., new User(a170.000);
for( User user : newUsers){
saveCreate( user )
}
}
saveCreate(User user){
userDao.create(user);
// which is calling somewhere the: getEntityManager().persist(entity);
}
}
如何为每 1000 行创建新事务?
1、每1000行刷新清除entityManager。它会创建一个新的交易吗?
int i = 0;
for( User user : newUsers){
saveCreate( user )
i++;
if( i % 1000 == 0 ){
userDao.getEntityManager.flush();
userDao.getEntityManager.clear();
}
}
2,使 saveCreate 方法 @Transactional ,而不是 schedule() ?
3,创建新类,使用@Transactional注释的新方法,并从中创建新实例,当有超过1000行时?
Transaction tr = new Transaction;
int i = 0;
for( User user : newUsers){
i++;
tr.singleTransaction( user );
if( i % 1000 == 0 ){
tr = = new Transaction;
}
}
public class Transaction{
@Transactional
public void singleTransaction( User user){
saveCreate( user );
}
}
4、还有什么?
先感谢您!
解决方案
编写一个插入 1000 条记录的方法并将其标记为 @Transactional(propagation = Propagation.REQUIRES_NEW)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveData(List<Object> data)..
然后,多次调用该方法,每当调用该方法时,都会创建新的事务。
推荐阅读
- genexus - 为什么无法从 Genexus .Net 使用某些外部 REST API?
- css - 在材质 UI 中,如何将 Button 置于 Grid 项目的中间?
- javascript - 检查 TypeScript 中的全局或窗口对象上是否存在属性
- google-apps-script - 使用出现错误的 Google 表格 onOpen() 函数时,如何获得实时脚本错误通知?
- prolog - Prolog 作为第一种编程语言
- html - 展开一张卡片时展开所有卡片的高度
- python - 安装 djangocms-blog 后的 ImportError: cannot import name 'python_2_unicode_compatible' from 'django.utils .encoding'
- java - 如何从 pagedList 中删除项目
- javascript - 在 python 中运行 javascript 函数
- python - 我无法将 dtypes 对象的 2d numpy ndarray 转换为 dtypes float