java.sql.SQLException:ResultSet关闭概率后不允许操作

时间:2014-12-03 19:20:01

标签: java sql-server swing jdbc thread-sleep

我尝试运行此代码时出错

我尝试了很多次 我尝试延迟3秒,然后从daabase读取下一个值 我有错误 java.sql.SQLException:ResultSet关闭后不允许操作

您对此错误的看法,因为我现在还不知道此错误

这是我的代码,请帮帮我

try {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        String dbUrl = "jdbc:mysql://*******/jointdb";
        String dbUsr = "****";
        String dbPass = "*****";
        String sql = "select * from eridb";
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(dbUrl, dbUsr, dbPass);
        st = conn.createStatement();
        rs = st.executeQuery(sql);
        while ( rs.next() ) {
        SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                String value = rs.getString("id");
                jTextArea1.setText(value); 
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (SQLException ex) {
                Logger.getLogger(KK.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });
        }
    } catch (Exception e) { }   
    finally{
        try{
           if (rs != null)
             rs.close();
           if (st != null) 
             st.close();
           if (conn != null) 
             conn.close();
        }catch(SQLException e){}
     }

3 个答案:

答案 0 :(得分:0)

您可以在其他主题中访问ResultSet。当它被调用时,原始线程已完成其try块,移至finally,并关闭ResultSet

答案 1 :(得分:0)

看起来你的Thread是主代码中的一个单独进程。您的主要代码将与您的主题并行运行。

也许您加入了使用主代码创建的线程,因此主代码可以在继续关闭结果集之前等待线程结束。要实现此目的,请尝试为您的线程提供一个引用,例如thread1,然后在主代码中添加以下语句。

thread1.join();

答案 2 :(得分:0)

根据定义,SwingUtilities.invokeLater将在处理完所有AWT事件后运行异步(文档here)。

因此,最可能的是,在执行finally内的Runnable代码之前,已到达SwingUtilities.invokeLater块。

我认为不需要异步执行记录处理,我建议你阅读并填写Jtextarea而不将其从当前线程中删除。