我尝试运行此代码时出错
我尝试了很多次 我尝试延迟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){}
}
答案 0 :(得分:0)
您可以在其他主题中访问ResultSet
。当它被调用时,原始线程已完成其try
块,移至finally
,并关闭ResultSet
。
答案 1 :(得分:0)
看起来你的Thread是主代码中的一个单独进程。您的主要代码将与您的主题并行运行。
也许您加入了使用主代码创建的线程,因此主代码可以在继续关闭结果集之前等待线程结束。要实现此目的,请尝试为您的线程提供一个引用,例如thread1,然后在主代码中添加以下语句。
thread1.join();
答案 2 :(得分:0)
根据定义,SwingUtilities.invokeLater
将在处理完所有AWT事件后运行异步(文档here)。
因此,最可能的是,在执行finally
内的Runnable
代码之前,已到达SwingUtilities.invokeLater
块。
我认为不需要异步执行记录处理,我建议你阅读并填写Jtextarea而不将其从当前线程中删除。