我想在单独的事务中每隔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)..
然后,多次调用该方法,只要调用该方法,就会创建新的事务。