mybatis 莫名的错误:Error querying database. Executor was closed. 求大神帮忙

在路上的一只猫 2016-04-01 05:41:19
public class MybatisUtil {
private static SqlSessionFactory factory=null;
static{
Reader reader=null;
try {
reader = Resources.getResourceAsReader("mybatis-conf.xml");//读取配置文件
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//创建SqlSessionFactoryBuilder对象
factory= builder.build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static ThreadLocal<SqlSession> t = new ThreadLocal<SqlSession>();
public static SqlSession getSqlSession(){//获得链接
SqlSession session = t.get();
try {
if(session==null){
session = factory.openSession();//打开链接
t.set(session);
}
//else if(!session.getConnection().isClosed())return session;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return session;
}
public static void close(SqlSession session){
if(session!=null)
session.close();//关闭
}
}

映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.baizhi.swh.dao.AccountDao">
<select id="queryAllUser" resultType="com.baizhi.swh.entity.Account">
select * from account
</select>
</mapper>


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.baizhi.swh.dao.UserDao">
<select id="select" parameterType="java.lang.String" resultType="com.baizhi.swh.entity.T_user">
select id,username,password from t_user where username=#{username}
</select>
<insert id="insert" parameterType="com.baizhi.swh.entity.T_user">
<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE">
select seq_user.nextval from dual
</selectKey>
insert into t_user values (#{id},#{username},#{password})
</insert>
</mapper>
service服务层
package com.baizhi.swh.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.baizhi.swh.dao.AccountDao;
import com.baizhi.swh.entity.Account;
import com.baizhi.swh.service.AccountService;
import com.baizhi.swh.util.MybatisUtil;

public class AccountServiceImpl implements AccountService{

@Override
public List<Account> queryAll() {
SqlSession session=null;//声明SqlSession 对象
List<Account> list=new ArrayList<Account>();//声明List集合
try {
session = MybatisUtil.getSqlSession();//获得session对象的链接
System.out.println(session);
AccountDao dao = session.getMapper(AccountDao.class);//调用dao中的AccountDao对象
//System.out.println(dao);
list = dao.queryAllUser();//调用类方法
System.out.println(list.size());
session.commit();//提交事务
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
MybatisUtil.close(session);//关闭连接
}return list;//返回list集合
}

}


package com.baizhi.swh.service.impl;

import org.apache.ibatis.session.SqlSession;

import com.baizhi.swh.dao.UserDao;
import com.baizhi.swh.entity.T_user;
import com.baizhi.swh.service.UserService;
import com.baizhi.swh.util.MybatisUtil;

public class UserServiceImpl implements UserService{

@Override
public void queryByUsernameAndPassword(String username, String password) {
//获得Dao的实现类
SqlSession sqlSession=null;//声明SqlSession 对象
T_user user=null;//声明user对象
try {

sqlSession = MybatisUtil.getSqlSession();//获取链接
System.out.println(sqlSession);
UserDao dao = sqlSession.getMapper(UserDao.class);//获取dao层UserDao对象
user = dao.select(username);//调用方法
//System.out.println(user);
if(user==null||!user.getPassword().equals(password)){//验证用户是否存在和密码是否一直
throw new RuntimeException("用户不存在或者密码不正确");//抛出异常
}
sqlSession.commit();//提交事务
System.out.println("==============================");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());//获得异常信息
} finally{
MybatisUtil.close(sqlSession);//关闭连接
}
}

@Override
public void register(String username,String password,String password1) {//注册的功能
SqlSession sqlSession=null;//声明SqlSession 对象
try {
sqlSession = MybatisUtil.getSqlSession();//获得链接
UserDao dao = sqlSession.getMapper(UserDao.class);//获得Dao层的对象
T_user user = dao.select(username);//调用方法
if(user!=null){//如果用户为空则抛出异常
throw new RuntimeException("用户已存在");
}
if(!password.equals(password1)){//如果密码不一致 这抛出异常
throw new RuntimeException("密码不一致,注册失败");
}
T_user user1 = new T_user();
user1.setUsername(username);//设置参数
user1.setPassword(password);
dao.insert(user1);
sqlSession.commit();//关闭连接
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());//获取异常信息
}finally{
MybatisUtil.close(sqlSession);
}
}

}
servlet程序
package com.baizhi.swh.service.impl;

import org.apache.ibatis.session.SqlSession;

import com.baizhi.swh.dao.UserDao;
import com.baizhi.swh.entity.T_user;
import com.baizhi.swh.service.UserService;
import com.baizhi.swh.util.MybatisUtil;

public class UserServiceImpl implements UserService{

@Override
public void queryByUsernameAndPassword(String username, String password) {
//获得Dao的实现类
SqlSession sqlSession=null;//声明SqlSession 对象
T_user user=null;//声明user对象
try {

sqlSession = MybatisUtil.getSqlSession();//获取链接
System.out.println(sqlSession);
UserDao dao = sqlSession.getMapper(UserDao.class);//获取dao层UserDao对象
user = dao.select(username);//调用方法
//System.out.println(user);
if(user==null||!user.getPassword().equals(password)){//验证用户是否存在和密码是否一直
throw new RuntimeException("用户不存在或者密码不正确");//抛出异常
}
sqlSession.commit();//提交事务
System.out.println("==============================");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());//获得异常信息
} finally{
MybatisUtil.close(sqlSession);//关闭连接
}
}

@Override
public void register(String username,String password,String password1) {//注册的功能
SqlSession sqlSession=null;//声明SqlSession 对象
try {
sqlSession = MybatisUtil.getSqlSession();//获得链接
UserDao dao = sqlSession.getMapper(UserDao.class);//获得Dao层的对象
T_user user = dao.select(username);//调用方法
if(user!=null){//如果用户为空则抛出异常
throw new RuntimeException("用户已存在");
}
if(!password.equals(password1)){//如果密码不一致 这抛出异常
throw new RuntimeException("密码不一致,注册失败");
}
T_user user1 = new T_user();
user1.setUsername(username);//设置参数
user1.setPassword(password);
dao.insert(user1);
sqlSession.commit();//关闭连接
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());//获取异常信息
}finally{
MybatisUtil.close(sqlSession);
}
}

}


package com.baizhi.swh.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.baizhi.swh.entity.Account;
import com.baizhi.swh.service.AccountService;
import com.baizhi.swh.service.impl.AccountServiceImpl;

public class QueryAllAction extends HttpServlet{
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("queryall");
// 获取编码格式和响应类型
resp.setContentType("text/html");
//获得ServletContext 实例对象 获得获取WEB应用的初始化参数。
ServletContext context = super.getServletContext();
String encoding = context.getInitParameter("encoding");
req.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);

//调用service层的AccoutServiceImpl实现类
AccountService as = new AccountServiceImpl();
System.out.println(as);
List<Account> list = as.queryAll();//调用类方法null
System.out.println(list.size());
//req.setAttribute("list", list);//利用Request作用域进行传输数据

//req.getRequestDispatcher("/queryallview").forward(req, resp);//forword跳转
}
}


mybatis配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="hr"/>
<property name="password" value="hr"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/baizhi/swh/dao/impl/UserDaoImpl.xml"/>
<mapper resource="com/baizhi/swh/dao/impl/AccountDaoImpl.xml"/>
</mappers>
</configuration>


报错
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:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at $Proxy7.queryAllUser(Unknown Source)
at com.baizhi.swh.service.impl.AccountServiceImpl.queryAll(AccountServiceImpl.java:24)
at com.baizhi.swh.action.QueryAllAction.service(QueryAllAction.java:33)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

初学者 求大神

...全文
1421 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Moon Lignt Shadow 2017-03-08
  • 打赏
  • 举报
回复
关闭SqlSession之后,还应该将它移出ThreadLocal,也就是再添一条代码:local.remove()

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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