优化Java中的插入调用以进行批量文件上载

时间:2017-02-10 11:18:00

标签: spring jpa insert bulk

DEPTCODE | empname | jobtype |部门| DOJ

  1. 121 |约翰|永久|帐户| 2012年12月12日

  2. 122 |保罗|永久|收入| 11/12/2011

  3. 123 |标志|承包商|销售| 04/05/2010

  4. 121 |麦克|永久|帐户| 08/09/2009

  5. 123 |纳什|承包商|销售| 2016年12月15日

  6. 124 | Doe的|承包商|营销| 2013年12月4日

  7. 问题描述:

    1. 这是我尝试使用MultiFileupload上传的CSV文件。

    2. 阅读并创建一个列表。

    3. 此列表针对EMP_TRANS_TABLE进行了重复验证 记录。

    4. DEPT_CODE + JOB_TYPE + DOJ成为我的复合主键。

    5. 我正在使用SPRING JPA Predicatesto检查重复值和 然后插入值。

    6. 这个工作正常,直到750个记录超过它需要更多 超过4分钟来保存数据并获得超时以发回响应     到前端。

    7. 技术堆栈:

      1)前端 - Angular JS

      2)Spring Rest Services和Spring JPA(休眠)

      3)Linux上的WAS 8.5 App服务器和SQL Server 2008

      4)Java 1.7

      问题

      1. 如何从java端优化我的数据库验证和插入 因为我无法改变数据库方面的任何内容而无法升级到Java 1.8也。
      2. 我的要求是在数据库验证中支持5000条记录 插入应该在2分钟内完成。
      3. 寻找具有相关代码的最佳解决方案,因为它必须应用于整个应用程序的多个网页上传。

1 个答案:

答案 0 :(得分:0)

你可以将hibernate属性定义为hibernate' s SessionFactory的一个属性:

<property name="jdbc.batch_size">500</property>

使用此批处理设置,您应该输出如下:

insert into Table(id , name) values (1, 'na1') , (2, 'na2') ,(3, 'na3')..

而不是

insert into Table(id , name) values (1, 'na1');
insert into Table(id , name) values (2, 'na2');
insert into Table(id , name) values (3, 'na3');

在交易方法中,您将持续存在大约500个实体..然后刷新您的交易以获得最佳性能,直到所有数据都已保存:

Transaction tx = session.beginTransaction();
for ( int i=0; i<5000; i++ ) {
    EmpTrans empTrans = new EmpTrans();

    // populate empTrans attributes

    session.save(empTrans);

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