【发布时间】:2026-01-09 20:30:02
【问题描述】:
我想在单独的事务中插入每 1000 行。 因此,如果有 3000 行,则应将其插入 3 个不同的事务中。 我不使用 Spring。
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,还有别的吗?
提前谢谢你!
【问题讨论】:
-
在 DB 中,创建一个存储过程,获取用户集合并提交给定数量的更新用户。
-
很遗憾,我无权访问数据库,也无法创建存储过程
标签: java hibernate jpa transactions jpa-2.0