Java 如何使用Spring transactional(@transactional)实现hibernate批插入?
我在后端使用Spring5.x和普通Hibernate。我想将数据从一个数据库传输到另一个数据库,一次处理1000条记录作为一个批处理。我在两个数据库中都有相同的表。我们已经配置了2个事务管理器和2个数据源详细信息。 我在hbm文件中配置了batch size=“1000”,如下所示Java 如何使用Spring transactional(@transactional)实现hibernate批插入?,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我在后端使用Spring5.x和普通Hibernate。我想将数据从一个数据库传输到另一个数据库,一次处理1000条记录作为一个批处理。我在两个数据库中都有相同的表。我们已经配置了2个事务管理器和2个数据源详细信息。 我在hbm文件中配置了batch size=“1000”,如下所示 <hibernate-mapping> <class table="User" name="com.my.User" batch-size="
<hibernate-mapping>
<class table="User" name="com.my.User" batch-size="1000">
<id name="id" .../>
<property name="name" ...>
...
@Transactional(value="oldDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class GetUserServiceImpl extends HibernateDaoImpl implements GetUserService {
...
public List<User> getAllUsers(int firstResult, int maxResults) {
DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
criteria.addOrder(Order.asc("id"));
List results = getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
if (!results.isEmpty()) {
for (User user: results ) {
saveUserService.saveUser(user);
}
}
return results;
...
}
@Transactional(value="newDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class SaveUserServiceImpl extends HibernateDaoImpl implements SaveUserService{
...
@Transactional(value="newDBTransactionManager", propagation = Propagation.REQUIRED, readOnly = false)
@Qualifier("newDBTransactionManager")
public void saveUser(User user) {
getHibernateTemplate().save(user);
}
...
...
我用@Transactional注释了两个服务类,并实现如下
<hibernate-mapping>
<class table="User" name="com.my.User" batch-size="1000">
<id name="id" .../>
<property name="name" ...>
...
@Transactional(value="oldDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class GetUserServiceImpl extends HibernateDaoImpl implements GetUserService {
...
public List<User> getAllUsers(int firstResult, int maxResults) {
DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
criteria.addOrder(Order.asc("id"));
List results = getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
if (!results.isEmpty()) {
for (User user: results ) {
saveUserService.saveUser(user);
}
}
return results;
...
}
@Transactional(value="newDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class SaveUserServiceImpl extends HibernateDaoImpl implements SaveUserService{
...
@Transactional(value="newDBTransactionManager", propagation = Propagation.REQUIRED, readOnly = false)
@Qualifier("newDBTransactionManager")
public void saveUser(User user) {
getHibernateTemplate().save(user);
}
...
@Transactional(value=“oldDBTransactionManager”传播=propagation.SUPPORTS,只读=true)
公共类GetUserServiceImpl扩展了HibernateDaioImpl实现GetUserService{
...
公共列表getAllUsers(int firstResult、int maxResults){
DetachedCriteria=DetachedCriteria.forClass(User.class);
标准.addOrder(Order.asc(“id”));
List results=getHibernateTemplate().findByCriteria(criteria、firstResult、maxResults);
如果(!results.isEmpty()){
for(用户:结果){
saveUserService.saveUser(用户);
}
}
返回结果;
...
}
@事务性(value=“newDBTransactionManager”传播=propagation.SUPPORTS,只读=true)
公共类SaveUserServiceImpl扩展HibernateDaoImpl实现SaveUserService{
...
@事务性(value=“newDBTransactionManager”,传播=propagation.REQUIRED,只读=false)
@限定符(“newDBTransactionManager”)
公共void saveUser(用户){
getHibernateTemplate().save(用户);
}
...
我正在从服务层外部(外部事务)调用上述getAllUsers服务方法,它将在内部调用saveUser服务方法(使用其他事务管理器),如下所示:
public class UserProcessActivity{
private int maxUsersPerIteration = 50;
...
private void processUsers(){
List<User> usersList;
long counter = 0;
int firstResult = 0;
usersList = getUserService.getAllUsers(firstResult, maxUsersPerIteration);
while (!usersList.isEmpty()) {
// some logic...
firstResult += usersList .size();
usersList = getUserService.getAllUsers(firstResult, maxUserPerIteration);
}
}
...
公共类UserProcessActivity{
私有int maxUsersPerIteration=50;
...
私有void processUsers(){
列出用户列表;
长计数器=0;
int firstResult=0;
usersList=getUserService.getAllUsers(firstResult,maxUsersPerIteration);
而(!usersList.isEmpty()){
//一些逻辑。。。
firstResult+=usersList.size();
usersList=getUserService.getAllUsers(firstResult,MaxUserPeraction);
}
}
...
我这里的问题是上面的代码是否处理批插入
如果是,作为批次1000(以hbm声明的批次大小)或50(使用MaxUserPacification为50指定的调用服务方法)插入的记录数是多少
如果不作为批处理执行插入操作,如何使用Spring@Trasactional和Hibernate实现批插入
如何对此批插入操作查询启用日志记录以了解实际的批操作信息
提前感谢。我建议阅读说明在hibernate中需要配置什么以实现批处理。我建议阅读说明在hibernate中需要配置什么以实现批处理。