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