2017-02-10 69 views
1

DEPTCODE | empname | jobtype |部门|司法部优化插入调用Java中进行批量文件上传

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

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

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

  4. 121 |迈克|永久|账户| 08/09/2009

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

  6. 124 |李四|承包商|营销| 2013年12月4日

问题描述:

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

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

  3. 此列表验证对EMP_TRANS_TABLE重复 记录。

  4. DEPT_CODE + JOB_TYPE +司法部与我复合主键。

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

  6. 除此之外,它正在采取更多 超过4分钟,以保存数据和获取超时响应发送回 到前端这是工作的罚款,直到750分的记录。

技术堆栈:

1)Frontend-角JS

2)弹簧安置服务和Spring JPA(休眠)

3)为8.5应用程序服务器和SQL Server Linux on Linux

4)Java 1.7

问题

  1. 我如何优化数据库验证和插入从Java方面 ,因为我无法改变从DB方任何东西,不能升级到Java 1.8也。
  2. 我的要求是支持5000条记录,其中在DB验证 和插入应在2分钟发生。
  3. 寻找最佳的解决方案与相关的代码,因为它必须应用于整个应用程序的多个网页上传。

回答

0

有休眠特性,你可以定义为Hibernate的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'); 

在trans你将持续大约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();