2016-09-23 86 views
-1

有人可以幫助優化下面的代碼。JDBC調用導致UI掛起

問題陳述是:我試圖通過循環列表列表來填充結構數組。這是造成性能問題。有沒有辦法做到這一點沒有循環?

下面的代碼按預期工作,但UI掛起因爲循環,有人可以幫助優化它。

public BigDecimal saveCSV(String dataSource,int rollNumber,String username,List<Project> projects) throws SQLException{ 
     Connection conn = getConnection(dataSource); 
     Connection nativeConn=doGetNativeConnection(conn); 
     nativeConn.setAutoCommit(false); 
     CallableStatement cs= nativeConn.prepareCall(ProjectConstants.PROC); 

     ArrayDescriptor des = ArrayDescriptor.createDescriptor("PROJECT_DETAILS_TYPE", nativeConn); 
     Object [] data = projects.toArray(); 
     Array array_to_pass = new ARRAY(des,nativeConn,data); 
     STRUCT[] structArrayOfProjects=new STRUCT[projects.size()]; 
     Object[] projObjectArray = null; 

     for (int i = 0; i < projects.size(); ++i) { 
      Project proj=projects.get(i); 
      projObjectArray=new Object[]{proj.name,proj.activity}; 
      StructDescriptor desc = StructDescriptor.createDescriptor("PROJECT_DETAILS_TYPE", nativeConn); 
      STRUCT structprojects = new STRUCT(desc, nativeConn, projObjectArray); 
      structArrayOfProjects[i] = structprojects; 
     } 
     ArrayDescriptor projectTypeArrayDesc = ArrayDescriptor.createDescriptor("PROJECT_DETAILS_TAB_TYPE", nativeConn); 
     ARRAY arrayOfProjects = new ARRAY(projectTypeArrayDesc, nativeConn, structArrayOfProjects); 

     cs.setArray(1, array_to_pass); 
     cs.setInt(2, rollNumber); 
     cs.setString(3, username); 
     cs.registerOutParameter(4, OracleTypes.ARRAY,"NUMBER_TAB_TYPE"); 
     cs.registerOutParameter(5, OracleTypes.ARRAY,"PROJECTS_ERROR_TAB_TYPE"); 

     cs.execute(); 
     nativeConn.commit(); 

     Array value=cs.getArray(4); 
     BigDecimal[] projDetailsId = (BigDecimal[])value.getArray(); 
     BigDecimal rmt_id = null; 
     try{ 
      rmt_id=projDetailsId[0]; 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 

     } 
     return rmt_id; 

    } 
+1

我覺得循環不是那麼費時代碼 – passion

回答

1

使用工作線程執行數據庫任務和UI線程來更新您的GUI。

不鼓勵在UI線程上執行I/O和CPU密集型任務。

由於您沒有指定要使用什麼樣的用戶界面,

我想搖擺,如果是讀this guide如何處理這樣的任務。

UPDATE

OP評論,其中的代碼運行環境後是Spring MVC的,這裏是建議。

同樣的邏輯適用於部署到servlet容器中的應用程序。 當您在請求線程中長時間運行任務時,應該使用ExecutorService創建異步任務並立即返回HTTP202。

然後,您需要使用一些輪詢方法來定期請求完成狀態(如果可能,請使用websocket)。

以下是一些示例:here,herehere

+0

是的,它是春天,你能提供一個樣本嗎? – fiddle

+0

春天還是鞦韆?它是桌面應用程序還是網絡? – rkosegi

+0

spring mvc,web app – fiddle