最近新写的一套JAVA封装类,运行期间出现了“java.sql.SQLException: Result set already closed”错误,出现的机率比较高,但又有一定的随机性,注释掉Resultset的close代码后问题依旧。
连接代码如下:
javax.naming.Context initCtx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup(_JNDI_NAME);
if (ds != null) {
_conn = ds.getConnection();
//return _conn;
}
查询代码如下:
Statement sm = _conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = sm.executeQuery(sqltext);
网上有说,同一语句运行两次就会出现些问题。CSDN论坛有说不要直接返回ResultSet,改为返回List:
List list = new ArrayList();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{
conn = openConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
while ( rs.next() )
{
Map map = new HashMap();
for ( int i = 1; i <= rsmd.getColumnCount(); i++ )
{
map.put(rsmd.getColumnName(i), rs.getString(i) == null ? " " : rs.getString(i));
}
list.add(map);
}
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
if ( rs != null ) rs.close();
closeConnection(conn);
}
return list;
见:http://topic.csdn.net/t/20040816/23/3280711.html
显然以上所描述的都不是问题根本解决办法。在查看封装类的代码时确定问题在finalize()上:
public class basePage {
protected void finalize()
{
........
dataBase.Disconnect();
}
}
这是因编程习惯而写下的代码,注释后问题消失。