sql >> Base de Datos >  >> RDS >> Mysql

Inserción por lotes usando SQL nativo en Hibernate

Hibernate tiene una funcionalidad por lotes. Pero en el caso anterior, estoy usando SQL nativo, según mi observación, el lote de hibernación no es muy efectivo en el caso de SQL nativo. Sí, seguramente evita el error de falta de memoria pero no mejora mucho el rendimiento. Por lo tanto Me retiré para implementar JDBC Batch en Hibernate. Hibernate proporciona el método doWork() para obtener la conexión desde la sesión de 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();