有人可以帮助优化下面的代码。
问题陈述是:我试图通过列表列表循环填充结构数组。这会导致性能问题。有没有一种不用循环的方法?
下面的代码工作如预期,但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;
}
使用工作线程执行DB任务,使用UI线程更新GUI。
不鼓励在UI线程上执行I/O和CPU密集型任务。
由于您没有指定您使用的是哪种用户界面,
我假设是Swing,如果是,请阅读如何处理此类任务的指南。
OP注释后,代码运行的环境是Spring MVC,这里是建议。
同样的逻辑也适用于部署到servlet容器中的应用程序。当你在请求线程中有长时间运行的任务时,你应该使用ExecutorService创建异步任务并立即返回HTTP202。
那么你需要使用一些轮询方法来定期请求完成状态(或者如果可能的话使用websocket)。
这里有一些例子:Here, Here或Here。