HIbernate 批量插入或更新在 Spring Boot 中不起作用

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

我需要在我的 MySQL 数据库中进行批量插入(近 10000 次)。我正在使用 JPA/hibernate 和 spring boot。我从 hibernate 文档中阅读了在 hibernate 中执行批量插入/更新,我认为我的代码不起作用,因为它是按顺序插入 hibernate 查询而不是在批量插入中执行它们。下面是我的代码。我是不是错过了什么?

这是我的数据源配置。

@Component
public class Datasource {

    @Autowired 
    EnvConfiguration configuration;
    
    private static final Logger logger = LoggerFactory.getLogger(Datasource.class);
    
    @Bean
    public DataSource dataSource(){
        logger.info("DataSource Bean creation...");
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(configuration.getDBDriver());
        dataSource.setUrl("jdbc:mysql://"+configuration.getDBIp()+":"+configuration.getDBPort()+"/"+configuration.getDBName()+"?autoReconnect=true&useSSL=false");
        dataSource.setUsername(configuration.getDBUser());
        dataSource.setPassword(configuration.getDBPass().trim());
        return dataSource;
    }
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory() {
        return new HibernateJpaSessionFactoryBean();
    }
}

我的角色域的代码

//Role.java

    @Entity
    @Table(name = "Role",uniqueConstraints = @UniqueConstraint(
            columnNames = { "roleName"}))
    public class Role {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long roleId;
        @NotNull
        private String roleName;
        public Role(){}
    
        public Role(String roleName){
            this.roleName = roleName;
        }
    
        public Long getRoleId() {
            return roleId;
        }
    
        public void setRoleId(Long roleId) {
            this.roleId = roleId;
        }
    
        public String getRoleName() {
            return roleName;
        }
    
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    
    
    }

以下是我的服务代码。这里我手动刷新会话。我添加了一个 sleep 函数,以便确定插入查询是一个接一个执行的,还是像 JDBC 批处理中那样以 10 个为一组执行。

@Service
public class RoleService{
    
    
    @Autowired
    private SessionFactory factory;
    
    @Autowired
    private DataSource source;

    private static final Logger logger =  LoggerFactory.getLogger(WalletService.class);


    public void insertRole(Collection<RegisterWallet> walletMetaCollection){

            if(factory==null){
                    System.out.println("factory is null");
                }else{
                    System.out.println("factory is working");
                    Session session = factory.openSession();
                    Transaction tx = session.beginTransaction();
        
                    for ( int i=0; i<100000; i++ ) {
                    Role role=new Role(""+i);
                    session.persist(role);
                System.out.println("this is the role id "+role.getRoleId());
   
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e){
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
   

 

            if ( i % 10 == 0 ) { //20, same as the JDBC batch size
  
                //flush a batch of inserts and release memory:
                    session.flush();
                    session.clear();
                }
            }
  

      
                    tx.commit();
                    session.close();
                }   
            }   
        }

根据我对批量操作的理解,应该一次插入10个角色,减少使用的jdbc往返次数。但上面代码的输出却出乎意料。它正在为每个 session.persist(..) 调用执行一次插入。

//This is log of the above code.


     Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 14
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 15
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 16
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 17
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 18
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 19
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 20
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 21
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 22
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 23
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 24
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 25
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 26
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 27
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 28
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 29
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 30
    Hibernate: insert into role (active, role_description, role_name) values (?, ?, ?)
    this is the role id 31
    </pre>

-------------------------------------------------------------

以下是我的application.properties配置

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
spring.jpa.properties.hibernate.jdbc.batch_size=10

我错过了什么吗?

请帮忙。

mysql hibernate spring-boot batch-processing
1个回答
0
投票

你没有遗漏任何东西。你的输出很正常。你可以通过此链接获取更多信息:[1]http://www.dineshonjava.com/2012/06/hibernate-batch-processing_10.html

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