我有一个问题,在开发服务器上运行(运行Weblogic 10.3.6),运行一个进程会导致:
java.sql.SQLException: Statement has already been closed
所有数据库操作(主要是插入/更新)仍然会发生并且看起来是正确的。但是,在我自己的工作站上的本地实例中运行不会触发该异常。
此代码应用程序运行Spring和Hibernate,触发代码在程序化事务中运行。
任何人都可以提供故障排除提示吗?
答案 0 :(得分:1)
如果你发布完整的堆栈跟踪,它将很容易回答。但我会给你解决方案的建议。对于我的练习java.sql.SQLException: Statement has already been closed
表示您的Statement
超时。当语句超时时,您将获得前面的异常。以下内容将帮助您了解如何配置Statement
超时等。
http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html
答案 1 :(得分:0)
此外,您必须注意关闭并初始化Statment,ResultSet和Connection,这些问题可能导致不良行为,例如,您可能会有这样的事情:
Connection conn = null;
PreparedStatement ps = null;
try {
conn = getConnection ();
for (TableBean tableBean : listTableBean) {
ps = conn.prepareStatement ("INSERT INTO table (id, desc) values (?, ?)");
ps.setInt (1, tableBean.getId());
ps.setString (2, tableBean.getDesc());
ps.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
如何看,ps
在循环结束前永远不会关闭,因此数据库可能会抛出超时错误,因为在这种情况下
数据库是负责结束会话的人。在必要时最好关闭会议。
Connection conn = null;
PreparedStatement ps = null;
for (TableBean tableBean : listTableBean) {
try {
conn = getConnection ();
ps = conn.prepareStatement ("INSERT INTO table (id, desc) values (?, ?)");
ps.setInt (1, tableBean.getId());
ps.setString (2, tableBean.getDesc());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
我希望此信息可以帮助您
祝你好运。