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

问题描述 投票:0回答:1

我想在单独的事务中每隔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,还有其他东西吗?

谢谢您!

java hibernate jpa transactions jpa-2.0
1个回答
0
投票

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

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

然后,多次调用该方法,只要调用该方法,就会创建新的事务。

© www.soinside.com 2019 - 2024. All rights reserved.