我正在使用Tomcat 7,Microsoft SQL Server 2008 RC2和JTDS驱动程序
我实际上也在尝试使用C3P0来解决这个问题,但它根本没有任何区别。我使用的是Microsoft的驱动程序,但它导致了其他问题(仅向前结果集不支持请求的操作)
我得到以下错误,总是在同一点上。在达到这一点之前,我已成功运行其他查询:
java.sql.SQLException:无效状态,ResultSet对象已关闭。 在 net.sourceforge.jtds.jdbc.JtdsResultSet.checkOpen(JtdsResultSet.java:287) 在 net.sourceforge.jtds.jdbc.JtdsResultSet.findColumn(JtdsResultSet.java:943) 在 net.sourceforge.jtds.jdbc.JtdsResultSet.getInt(JtdsResultSet.java:968) 在 com.mchange.v2.c3p0.impl.NewProxyResultSet.getInt(NewProxyResultSet.java:2573) 在com.tt.web.WebPosition.createPosition(WebPosition.java:863)
代码如下:
public static List getListPositions(String query) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
List list = null;
try { //execute the sql query and create the resultSet
con = DBConnection.getInstance().getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(query);
while(rs.next()) {
if(rs.isFirst()) {
list = new ArrayList();
}
WebPosition webPos = null;
webPos = new WebPosition(rs);
list.add(webPos);
}
} catch (java.sql.SQLException e) {
System.out.println("SQLException in getListPositions");
System.out.print(query);
Log.getInstance().write(query);
Log.getInstance().write(e.toString());
} catch (Exception ex) {
System.out.print(ex);
ex.printStackTrace();
Log.getInstance().write(ex.toString());
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
Log.getInstance().write(e.toString());
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
Log.getInstance().write(e.toString());
}
}
DBConnection.getInstance().returnConnection(con);
}
return list;
}
public WebPosition(ResultSet rs) {
createPosition( rs);
}
public void createPosition(ResultSet rs) {
try {
this.setCurrentDate4Excel(rs.getString("SYSDATE_4_EXCEL"));
this.setExerciseType(rs.getInt("EXERCISE_STYLE_CD"));
...
代码在上述两行之间失败。
我无法解释为什么结果集会在函数中间关闭(即它将检索rs.getString(“SYSDATE_4_EXCEL”)但是然后失败并在rs.getInt行发布错误( “EXERCISE_STYLE_CD”))
有没有人有任何想法?我想这是某种内存问题,并且在一定数量的数据之后连接会自动关闭,但我不知道如何解决这个问题。我尝试增加JVM的堆大小。