Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC调用导致UI挂起_Java_Spring Mvc_Jdbc_Long Running Processes - Fatal编程技术网

Java JDBC调用导致UI挂起

Java JDBC调用导致UI挂起,java,spring-mvc,jdbc,long-running-processes,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 = getC

有人能帮我优化下面的代码吗

问题陈述是:我试图通过循环列表来填充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;

    }
public BigDecimal saveCSV(字符串数据源、int rollNumber、字符串用户名、列表项目)抛出SQLException{
连接conn=getConnection(数据源);
连接nativeConn=doGetNativeConnection(连接);
nativeConn.setAutoCommit(错误);
CallableStatement cs=nativeConn.prepareCall(ProjectConstants.PROC);
ArrayDescriptor des=ArrayDescriptor.createDescriptor(“项目详细信息类型”,nativeConn);
Object[]data=projects.toArray();
Array Array_to_pass=新数组(des、nativeConn、data);
STRUCT[]structArrayOfProjects=新结构[projects.size()];
对象[]projObjectArray=null;
对于(int i=0;i
使用辅助线程执行DB任务,使用UI线程更新GUI

不鼓励在UI线程上执行I/O和CPU密集型任务

由于您没有指定正在使用的用户界面类型

我假设Swing,如果是,请阅读如何处理此类任务

更新

在评论代码运行的环境是SpringMVC之后,下面是建议

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

然后,您需要使用一些轮询方法来定期请求完成状态(如果可能,也可以使用websocket)


这里有一些例子:,或。

我认为循环在您的代码中并没有花费那么多时间。是的,它是spring,您能提供一个示例吗?spring或swing?是桌面应用还是网络应用?spring mvc,网络应用