Mybatis - Executor was closed.

当我在登录页面输入了一个测试账号和密码之后,熟悉的页面:
在这里插入图片描述
这次的错误涉及到线程问题:
在这里插入图片描述

<!--login.html-->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" th:href="@{/css/login.css}">
    <script type="text/javascript" th:src="@{/js/login.js}"></script>
</head>
<body>
    <h1>Hello!This is login.html</h1>
    <form action="#" th:action="@{/login}" th:object="${user}" method="post">
        <span style="color:red" th:text="${msg}"></span>
        <p>Account: <input type="text" th:field="*{account}" /></p>
        <p>Password: <input type="text" th:field="*{password}"/></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
</body>
</html>
//loginController
@Controller
public class loginController {

    @GetMapping("/login")
    public String loginForm(Model model){
        model.addAttribute("user",new User());
        return "login";
    }

    @PostMapping("/login")
    public String loginSubmit(@ModelAttribute User user, Model model ,Map<String,Object>map){
        UserService userService = new UserService();
        if(userService.login(user)){
            User user_show = userService.get(user.getAccount());
            model.addAttribute("user",user_show);
            return "home";
        }else {
            map.put("msg","用户名或密码错误");
            return "login";
        }
    }
}
//UserService
public class UserService implements IUserService {
	SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    @Override
    public User get(int account){
        User user_get = mapper.getUser(account);
        sqlSession.close();
        return user_get;
    }

    @Override
    public boolean login(User user) {
        User user_login = mapper.getUser(user.getAccount());
        sqlSession.close();
        if(user_login.getPassword().equals(user.getPassword())) return true;
        else return false;
    }

问题就出在我的UserService上:我使用了一个全局的sqlSession,这个sqlSession close()之后,其他业务功能就不能再使用这个sqlSession了,例如在我的loginController文件中,login()使用了这个sqlSession之后将它关闭了,那么它后面的get()就不能使用它了。除非再次把它打开。笨拙的办法就是在每个业务功能上添加这两行代码:

	SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

这样的话,每个功能就可以有单独的一个sqlSession,这样绝对不会出现关闭了不能使用的情况。
但是作为一个懒狗,我不允许让这种重复代码出现多次(虽然之前一直这样做),所以,我想了一个办法,那就是让sqlSession开启关闭、开启关闭…是不是简单很多?但是我并没有找到开启sqlSession的方法。
而且这样感觉怪怪的,后来我想了想,我直接让他一直开着不就行了?

@Service("userService")
public class UserService implements IUserService {

    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    @Override
    public User get(int account){
        User user_get = mapper.getUser(account);
        return user_get;
    }

    @Override
    public boolean login(User user) {
        User user_login = mapper.getUser(user.getAccount());
        if(user_login.getPassword().equals(user.getPassword())) return true;
        else return false;
    }

这样代码又简洁了不少,问题也得到了解决。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值