优化插入调用Java中进行批量文件上传
问题描述:
DEPTCODE | empname | jobtype |部门|司法部优化插入调用Java中进行批量文件上传
121 |约翰|永久|账户| 2012年12月12日
122 |保罗|永久|收入| 2011/11/12
123 |标志|承包商|销售| 04/05/2010
121 |迈克|永久|账户| 08/09/2009
123 |纳什|承包商|销售| 2016年12月15日
124 |李四|承包商|营销| 2013年12月4日
问题描述:
这是我尝试使用MultiFileupload上载的CSV文件。
阅读并创建一个列表。
此列表验证对EMP_TRANS_TABLE重复 记录。
DEPT_CODE + JOB_TYPE +司法部与我复合主键。
我正在使用SPRING JPA Predicatesto检查重复值并且 然后插入值。
除此之外,它正在采取更多 超过4分钟,以保存数据和获取超时响应发送回 到前端这是工作的罚款,直到750分的记录。
技术堆栈:
1)Frontend-角JS
2)弹簧安置服务和Spring JPA(休眠)
3)为8.5应用程序服务器和SQL Server Linux on Linux
4)Java 1.7
问题
- 我如何优化数据库验证和插入从Java方面 ,因为我无法改变从DB方任何东西,不能升级到Java 1.8也。
- 我的要求是支持5000条记录,其中在DB验证 和插入应在2分钟发生。
- 寻找最佳的解决方案与相关的代码,因为它必须应用于整个应用程序的多个网页上传。
答
有休眠特性,你可以定义为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();