org.apache.ibatis.executor.ExecutorException: Executor was closed.

3,716 阅读1分钟
  • 最近写Mybatis的JavaWeb项目踩的坑太多了,(都想哭了,但是咬牙坚持了下来,继续敲)。

说说今天的主角;org.apache.ibatis.executor.ExecutorException: Executor was closed.

程序运行起来,执行一个页面后返回一个新页面的数据是上一个页面的。这就痛苦了。控制台提示如下

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed.
### Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed.
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
	at com.damu.dao.UsersDAO.findById(UsersDAO.java:37)
	at com.damu.servlet.UserFindByIdServlet.doPost(UserFindByIdServlet.java:19)
	at com.damu.servlet.UserFindByIdServlet.doGet(UserFindByIdServlet.java:28)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

在查找众多资料中,发现sessio在查询数据全部的时候,已经关闭了,代码如下:

    public List<Users> findAll() {
        try {
            list = sqlSession .selectList("findAll");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
        return list;
    }

    /*
     * 查询单个用户*/
    public Users findById(Integer id) {
        try {
            users = sqlSession.selectOne("findById", id);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
        return users;
    }

在执行第一session的时候已经关闭了,修代码如下

        sqlSession = SqlSessionFactoryUtils.getsqlSessionFactory().openSession();
        return sqlSession;
    }

把要用的session抽象到一方法里面,一个方法只是关闭一次。 总结:

  • 多思考代码原理,和逻辑思想 *细心