2017-07-25 6 views
0

Ich muss Masseneinfügungen (fast 10000) in meiner MySQL-Datenbank aktualisieren. Ich benutze jpa/Hibernate und Spring Boot. Ich lese Bulk einfügen/Update in Hibernate aus Hibernate-Dokumentation, ich denke, dass mein Code nicht funktioniert, da es die Hibernate-Abfragen sequentiell Einfügen statt die dann in der Gruppe. Unten ist mein Code. Vermisse ich etwas?HIbernate Batch-Insert oder Update funktioniert nicht im Frühjahr boot

Hier ist meine DataSource-Konfiguration.

@Component 
public class Datasource 
`enter code here`{ 
    @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(); 
    } 

} 

-Code für meine Rolle Domain

//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; 
     } 


    } 

Unten ist mein Service-Code. Hier spüle ich die Sitzung. Ich habe eine Sleep-Funktion hinzugefügt, um herauszufinden, ob die insert-Abfrage einzeln ausgeführt wird oder ob sie in einem Batch von 10 ausgeführt werden, wie es in jdbc batch geschieht.

@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(); 
       } 
      } 
     } 

Gemäß meinem Verständnis über die Batch-Betrieb 10 Rollen sollten sofort eingesetzt werden, um Anzahl der jdbc Rundfahrten verwendet zu vermeiden. Aber die Ausgabe des obigen Codes ist ruhig unerwartet. Es führt einen Einfügevorgang pro Sitzung aus.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> 

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

Es folgt meine application.properties Konfiguration

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

bin ich etwas fehlt?

bitte helfen.

+0

könnte hilfreich sein: https://stackoverflow.com/a/35794220/4754790 –

+0

Danke M.Deinum In der Tat war es hilfreich. Danke nochmal. Du hast mich vor vielen Schwierigkeiten gerettet. Ich war seit den letzten 3 Tagen mit diesem Problem beschäftigt. Prost Happy Coding – Prashank

Antwort

0

Sie anything.Your Ausgang are't fehlt, ist ganz kann normal.You auf diesen Link erhalten mehr Informationen: [1] http://www.dineshonjava.com/2012/06/hibernate-batch-processing_10.html

+0

Thanx Anzor für die Antwort, ich lese Tutorial auf den Link von Ihnen geschrieben, aber auch in diesem Tutorial Hibernate fügt sequentiell nicht es Batch. Aber dieser Link war hilfreich, da er erklärt, dass das Batch-Update in hiberate für zwei Dinge verwendet wird, um den Session-Cache zu löschen und um ähnliche SQL-Abfragen im Batch auszuführen. Es bot nur die erste Funktionalität, nicht die zweite. – Prashank

+0

Versuchen Sie einfach, diese beiden Zeilen zu Ihrer Anwendungseigenschaftendatei hinzuzufügen. spring.jpa.properties.hibernate.order_inserts = true spring.jpa.properties.hibernate.order_updates = true –

+0

Falls jemand unter dem gleichen Problem leidet, ändert die Lösung den Generierungstyp des Primärschlüssels von der Identity- in die Generation-Type-Tabelle oder manuell den Primärschlüssel durch Setter-Methode hinzufügen, nur dann können Sie die Vorteile von Batch-Einfügungen/Update erhalten. – Prashank

Verwandte Themen