最近新寫的一套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();
}
}
這是因編程習慣而寫下的代碼,注釋後問題消失。