Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion par lots à l'aide de SQL natif dans Hibernate

Hibernate a une fonctionnalité Batch.Mais dans le cas ci-dessus, j'utilise SQL natif, selon mon observation, le lot d'hibernation n'est pas très efficace en cas de SQL natif.Oui, cela évite sûrement l'erreur de mémoire insuffisante mais n'améliore pas beaucoup les performances.Par conséquent Je me suis retiré pour implémenter JDBC Batch dans Hibernate.Hibernate fournit la méthode doWork() pour obtenir la connexion à partir de la session Hibernate.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//get Connction from Session
session.doWork(new Work() {
       @Override
       public void execute(Connection conn) throws SQLException {
          PreparedStatement pstmt = null;
          try{
           String sqlInsert = "insert into sampletbl (name) values (?) ";
           pstmt = conn.prepareStatement(sqlInsert );
           int i=0;
           for(String name : list){
               pstmt .setString(1, name);
               pstmt .addBatch();

               //20 : JDBC batch size
             if ( i % 20 == 0 ) { 
                pstmt .executeBatch();
              }
              i++;
           }
           pstmt .executeBatch();
         }
         finally{
           pstmt .close();
         }                                
     }
});
tx.commit();
session.close();