我写一个 服务器端的 数据库查询,结果出了问题:java.sql.SQLException:关闭的连接: next
首先,请看代码:/***
*这是查询部分
*/
private ResultSet select(String flag ,int id , String name){
ResultSet rs = null ;
GetConnection getConn = new GetConnection();
Connection conn ;
Statement stat = null ;
String sql = null ;
if( null == flag ) flag = " * ";
if( id < 0 && null == name)sql = "select "+ flag + " from user_inf " ;
if( id >=0 && null == name)sql = "select "+ flag + " from user_inf where id = " + id ;
if( id < 0 && null != name)sql = "select "+ flag + " from user_inf where name = " + parseSqlDate(name) ;
if( id >=0 && null != name)sql = "select "+ flag + " from user_inf where id = " + id + " and name = " + parseSqlDate(name);
System.out.println(sql);
try{
conn = getConn.open();
stat = conn.createStatement();
rs = stat.executeQuery(sql);
r =rs ;
}
catch(Exception err){err.printStackTrace();}
finally{
try {
if( null!=stat || !stat.isClosed())
stat.close();
}
catch (SQLException e) {e.printStackTrace();}
getConn.close();
}
return r;
}
private ResultSet r = null ;//这是类变量 !
这是测试部分:package util.db;import java.sql.ResultSet;
import java.sql.SQLException;public class test {
public static void main(String[] args){
OperateUser_Inf o = new OperateUser_Inf();
ResultSet rs = o.findAll();
System.out.println(rs);
try {
while( rs.next()){
System.out.print(rs.getInt(1));
System.out.print(rs.getString(2));
System.out.print(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}这是报错:java.sql.SQLException: 关闭的连接: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:180)
at util.db.test.main(test.java:12)注:Debug发现rs存在,不为bull !
错在 rs.next()。我不懂 ......
首先,请看代码:/***
*这是查询部分
*/
private ResultSet select(String flag ,int id , String name){
ResultSet rs = null ;
GetConnection getConn = new GetConnection();
Connection conn ;
Statement stat = null ;
String sql = null ;
if( null == flag ) flag = " * ";
if( id < 0 && null == name)sql = "select "+ flag + " from user_inf " ;
if( id >=0 && null == name)sql = "select "+ flag + " from user_inf where id = " + id ;
if( id < 0 && null != name)sql = "select "+ flag + " from user_inf where name = " + parseSqlDate(name) ;
if( id >=0 && null != name)sql = "select "+ flag + " from user_inf where id = " + id + " and name = " + parseSqlDate(name);
System.out.println(sql);
try{
conn = getConn.open();
stat = conn.createStatement();
rs = stat.executeQuery(sql);
r =rs ;
}
catch(Exception err){err.printStackTrace();}
finally{
try {
if( null!=stat || !stat.isClosed())
stat.close();
}
catch (SQLException e) {e.printStackTrace();}
getConn.close();
}
return r;
}
private ResultSet r = null ;//这是类变量 !
这是测试部分:package util.db;import java.sql.ResultSet;
import java.sql.SQLException;public class test {
public static void main(String[] args){
OperateUser_Inf o = new OperateUser_Inf();
ResultSet rs = o.findAll();
System.out.println(rs);
try {
while( rs.next()){
System.out.print(rs.getInt(1));
System.out.print(rs.getString(2));
System.out.print(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}这是报错:java.sql.SQLException: 关闭的连接: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:180)
at util.db.test.main(test.java:12)注:Debug发现rs存在,不为bull !
错在 rs.next()。我不懂 ......
finally{
try {
if( null!=stat || !stat.isClosed())
stat.close();
}
catch (SQLException e) {e.printStackTrace();}
getConn.close();
}
这句话应该是关闭数据库连接的吧?ResultSet是依赖Connection的,你执行next()的时候,它就要去数据库读取下一条记录。
java.sql.SQLException: 关闭的连接: next问题如果在rs.next()之前关闭了Statement或PreparedStatement,会导致:
java.sql.SQLException: 关闭的语句: next如果在rs.next()之前关闭了ResultSet,会导致:
java.sql.SQLException: 关闭的 Resultset: next
(to LZ:外层rs的关闭操作可别删了)
(to LZ:外层rs的关闭操作可别删了)我自己解决了,用一个List在ResultSet被close前接受它!新问题:
直接定义 ArrayList a = new ArrayList();然后a.add(rs);没有丝毫问题,
但是如果定义为 ArrayList<?> a = new ArrayList();就不能a.add(rs),也不能add()其他数据,为什么呢?我表示我泛型没学好
——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~
——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~
学习了~
(霸占2012全年java月专家排行第一,牛掰~)
——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~学习了 !!!