2017-02-10 77 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();