2016-09-23 19 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

ワーカースレッドを使用してDBタスクとUIスレッドを実行してGUIを更新します。

UIスレッドでI/OとCPUを多用するタスクはお勧めできません。

あなたは、あなたが使用しているユーザ・インタフェースの種類

を指定していなかったように、このようなタスクを処理する方法をthis guideを読めば、私は、スイングを前提としています。 OPのコメントコードが実行されている環境の後

UPDATE

は、ここでは、Spring MVCのある提案です。

同じロジックは、サーブレットコンテナにデプロイされたアプリケーションに適用されます。 リクエストスレッドで長時間実行しているタスクがある場合は、ExecutorServiceを使用して非同期タスクを作成し、すぐにHTTP202を返す必要があります。

その後、定期的に完了ステータスを要求するために、いくつかのポーリング方法を使用する必要があります(または可能であればwebsocketを使用してください)。

例:herehereまたはhereです。

+0

はい、それは春です、あなたはサンプルを提供できますか? – fiddle

+0

スプリングまたはスイング?それはデスクトップアプリですか、ウェブですか? – rkosegi

+0

spring mvc、web app – fiddle

関連する問題