ResultSet is closed是怎么回事!

sbtgh1 2007-02-09 06:06:50
我用的struts+eclips+tomcat5.0
当我在一个jsp里面点一个连接,动作是xxxAction.do
这个时候报错
这是为什么!
java.sql.SQLException: ResultSet is closed
at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6647)
at sun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(JdbcOdbcResultSet.java:1764)
at sun.jdbc.odbc.JdbcOdbcResultSet.close(JdbcOdbcResultSet.java:1467)
at org.apache.commons.dbcp.DelegatingResultSet.close(DelegatingResultSet.java:193)
at org.apache.commons.dbcp.DelegatingPreparedStatement.passivate(DelegatingPreparedStatement.java:298)
at org.apache.commons.dbcp.DelegatingPreparedStatement.close(DelegatingPreparedStatement.java:185)
at struts.sample.cap1.sample3.dao.AttackSolutionDAO.retrieveAllAttackSolution(AttackSolutionDAO.java:218)
at struts.sample.cap1.sample3.action.ShowAttackSolutionAction.execute(ShowAttackSolutionAction.java:24)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
at java.lang.Thread.run(Thread.java:595)
java.lang.RuntimeException: ERROR.UNEXPECTED
at struts.sample.cap1.sample3.dao.AttackSolutionDAO.retrieveAllAttackSolution(AttackSolutionDAO.java:228)
at struts.sample.cap1.sample3.action.ShowAttackSolutionAction.execute(ShowAttackSolutionAction.java:24)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
at java.lang.Thread.run(Thread.java:595)
...全文
3350 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbtgh1 2007-02-10
  • 打赏
  • 举报
回复
问题解决了~非常感谢你!
stephenchin 2007-02-10
  • 打赏
  • 举报
回复
不好意思,喝了点酒,大脑有点乱,代码没仔细看,现在酒醒了,应该还是资源关闭顺序错了。rs还没关,就先关ps和con,rs引用的对象不存在了,关闭rs肯定要抛SQLxception。
应该是
finally {
try {
if (rs != null) {
rs.close();
}

if (ps != null) {
ps.close();
}

if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("ERROR.UNEXPECTED");
}
}
sbtgh1 2007-02-09
  • 打赏
  • 举报
回复
原始代码是把关闭资源写在finally里!
但是return list是写在finally后面才可以啊!
这样一来就会报result is closed错
stephenchin 2007-02-09
  • 打赏
  • 举报
回复
把关闭资源的代码写在funally里
stephenchin 2007-02-09
  • 打赏
  • 举报
回复
说错了,不需要加return null;了
stephenchin 2007-02-09
  • 打赏
  • 举报
回复
finally里面最后再加一个return null;
sbtgh1 2007-02-09
  • 打赏
  • 举报
回复
我刚才把finally后面的去掉了!可以运行了!
现在的问题是怎么写代码
可以return list 以可以把rs 和con关闭啊!而不报result is closed的错啊
sbtgh1 2007-02-09
  • 打赏
  • 举报
回复
不可以放到while后面`
这个方法的类型是public Collection retrieveAllAttackSolution()
这个return list是最后返回的
按上面说的这样报错!return后面的代码无法到达!
stephenchin 2007-02-09
  • 打赏
  • 举报
回复
简单的说就是把return list;放到while后面

while (rs.next()){
......
}
return list;
stephenchin 2007-02-09
  • 打赏
  • 举报
回复
try {
if (ps != null) {
ps.close();
con.close();
}

if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("ERROR.UNEXPECTED");
}
}

return list;
}
///////////////
上面资源关闭顺序有问题,rs先关闭了,list当然就没有了。
关闭顺序应该和开启顺序相反。
先return list,再rs.close(),conn.close().
sbtgh1 2007-02-09
  • 打赏
  • 举报
回复
我知道是集结关了`
要怎么解决呢?
sbtgh1 2007-02-09
  • 打赏
  • 举报
回复
业务逻辑是这样的
xxxAction.do作用到xxxAction调用下面DAO里面的方法retrieveAllAttackSolution()
过程是这样的
高手帮下!
package struts.sample.cap1.sample3.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import javax.sql.DataSource;

import struts.sample.cap1.sample3.entity.AttackSolution;

public class AttackSolutionDAO {
//�ṩһ��JDBC��l�ӱ����ñ������ڹ��캯���б����ò���ֵ
private DataSource dataSource;

/**
* Ĭ�ϵĹ��캯��
*/
public AttackSolutionDAO() {
}

/**
* �ڹ��캯���ṩJDBCl�ӵĽӿ�DataSource
*/
public AttackSolutionDAO(DataSource ds) {
dataSource = ds;

}
...
....
public Collection retrieveAllAttackSolution() {
//�ṩһ���Ԥ����SQL ���ı�
PreparedStatement ps = null;

//�ṩһ���SQL��ѯ����ResultSet�ӿڱ�
//ResultSet�����α����ָ�򷵻ؽ���е�ij���¼
ResultSet rs = null;


//ʵ��Collection�ӿڵ�ArrayList�࣬���������ʵ����Ϊ�������ķ���
ArrayList list = new ArrayList();

//SQL��䡰�������ѯfw_attacksolution�attack_event_code����
String sql = "SELECT attack_event_code,attack_mean, attack_action from fw_attacksolution order by attack_event_code";

//JDBCl��
Connection con = null;

try {
//ȡ��JDBCl��
con = dataSource.getConnection();

//�ж�JDBCl���Ƿ񱻹رգ���ر���ֱ���׳�һ��IllegalStateException
if (con.isClosed()) {
throw new IllegalStateException("ERROR.THE CONNECTION ISCLOSED");
}

//Ԥ����SQL ��䲢ִ��
ps = con.prepareStatement(sql);
rs = ps.executeQuery();

//�����ؽ�����м�¼ʱ���д���
while (rs.next()) {
//����AttackSolution���͵ı���ʵ��
//�����ﲻ�������ѭ�������ʵ���ԭ��������Լ�����һ��
AttackSolution attackSolution = new AttackSolution();
attackSolution.setAttack_event_code(rs.getString(1));
attackSolution.setAttack_mean(rs.getString(2));
attackSolution.setAttack_action(rs.getString(3));
list.add(attackSolution);
}
//��׽SQLException
} catch (SQLException ex) {
//�ڿ���̨��SQLException��ӡ��4�������
ex.printStackTrace();
} finally {
//�������δ���Ĺ������뽫JDBCl�ӹر�
try {
if (ps != null) {
ps.close();
con.close();
}

//ע�����ﻹҪ�ر�ResultSet�Ľӿڱ�
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("ERROR.UNEXPECTED");
}
}
//����list
return list;
}


....
....
public static void main(String[] args) {
}
}
interpb 2007-02-09
  • 打赏
  • 举报
回复
结果集已经关掉了

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧