程序如果有几十个并发数的时候,会出现“java.sql.SQLException: 关闭的 Resultset: next”的异常。
这个异常一般会是因为在rs.next()之前就关闭了Statement对象才会有的。
但是,程序如果在单线程的情况下就没有此问题,不知道大家有什么解决的办法来避免这个问题,部分代码如下: //conn为Connection对象。在整个的程序中,是一个静态变量
stmt = conn.createStatement();
rsRow = stmt.executeQuery(strSQL); // 获取记录
while (rsRow.next()) { //程序在此处报错
stateList.add(rsRow.getString("execute_state"));
}
rsRow.close();
stmt.close();
rsRow = null;
stmt = null;
异常信息:java.sql.SQLException: 关闭的 Resultset: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:175)
at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next()Z(Unknown Source)
at com.ngoss.framework.db.impl.WorkorderDAOImpl.selectWorkOrder(WorkorderDAOImpl.java:347)
at com.ngoss.framework.impl.RequestManagerImpl.selectWorkOrder(RequestManagerImpl.java:110)
这个异常一般会是因为在rs.next()之前就关闭了Statement对象才会有的。
但是,程序如果在单线程的情况下就没有此问题,不知道大家有什么解决的办法来避免这个问题,部分代码如下: //conn为Connection对象。在整个的程序中,是一个静态变量
stmt = conn.createStatement();
rsRow = stmt.executeQuery(strSQL); // 获取记录
while (rsRow.next()) { //程序在此处报错
stateList.add(rsRow.getString("execute_state"));
}
rsRow.close();
stmt.close();
rsRow = null;
stmt = null;
异常信息:java.sql.SQLException: 关闭的 Resultset: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:175)
at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next()Z(Unknown Source)
at com.ngoss.framework.db.impl.WorkorderDAOImpl.selectWorkOrder(WorkorderDAOImpl.java:347)
at com.ngoss.framework.impl.RequestManagerImpl.selectWorkOrder(RequestManagerImpl.java:110)
我没有在遍历之前关闭呀。
是在遍历之后关闭的。放在finally里是可以,但是和这个效果一样,还是会报一样的错误
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getConnection();
String sql = "xxxx";
ps = con.preparedSatement(sql);
ps.setXxxxx(1, xxx);
rs = ps.executeQuery();
while(rs.next()) {
Xxxx xxx = rs.getXxxx();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
if (ps != null) try { ps.close(); } catch (SQLException e) { e.printStackTrace(); }
if (con != null) try { con.close(); } catch (SQLException e) { e.printStackTrace(); }
}千万别在 JDBC 上自作聪明,在并发很高的情况下,可能会带来灾难性的后果。
我在申请连接与释放连接的地方也都做了同步的操作,并且在这个位置也加了一个记数器来测试,可以肯定是在申请后的连接均释放了。
这种情况在单线程跑的时候,不会出现,查询连接数,很快会回到原始数量。所以,请问一下,连接池里面的连接数怎么样才能让他马上回恢到原始数量,因为在高并发的时候,很容易发现在连接池的连接数会大量的增加之后,再过来的请求就一直在排除等待拿Connection直至事务超时。