gpt4 book ai didi

java - JPA在多个事务中插入行,限制单个事务中的最大行数

转载 作者:行者123 更新时间:2023-12-01 16:21:57 27 4
gpt4 key购买 nike

我想在单独的事务中插入每 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,还有别的吗?

提前谢谢您!

最佳答案

编写一个方法,插入 1000 条记录并将其标记为 @Transactional(propagation = Propagation.REQUIRES_NEW)

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveData(List<Object> data)..

然后,调用该方法几次,每当调用该方法时,就会创建新的事务。

关于java - JPA在多个事务中插入行,限制单个事务中的最大行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com