JDBC调用导致UI挂起

时间:2016-09-23 05:04:38

标签: java spring-mvc jdbc long-running-processes

有人可以帮助优化下面的代码。

问题陈述是:我试图通过循环列表列表来填充struct数组。这导致了性能问题。有没有办法没有循环呢?

下面的代码按预期工作,但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 个答案:

答案 0 :(得分:1)

使用工作线程执行数据库任务和UI线程来更新GUI。

不建议在UI线程上执行I / O和CPU密集型任务。

由于您未指定所使用的用户界面,

我假设Swing,如果是这样,请阅读this guide如何处理此类任务。

<强>更新

OP评论说运行代码的环境是Spring MVC,这是建议。

相同的逻辑适用于部署到servlet容器中的应用程序。 当您在请求线程中有长时间运行的任务时,您应该使用ExecutorService来创建异步任务并立即返回HTTP202。

然后你需要使用一些轮询方法来定期请求完成状态(或者如果可能的话,使用websocket)。

以下是一些示例:hereherehere