Closing non transactional SqlSession出现的原因,怎么加解决
时间: 2023-10-24 13:20:26 浏览: 970
在使用 MyBatis 进行数据库操作时,如果没有开启事务,则默认是非事务操作。而非事务操作在执行完 SQL 后,需要手动关闭 SqlSession,否则会出现 Closing non transactional SqlSession 异常。
解决方法有两种:
1. 在使用 SqlSession 的地方添加事务注解 @Transactional,使其变为事务操作,这样在事务执行完毕后会自动关闭 SqlSession。
2. 在使用完 SqlSession 后手动关闭 SqlSession,可以通过在 finally 中调用 sqlSession.close() 方法来实现。
示例代码:
```
public class UserDaoImpl implements UserDao {
@Autowired
private SqlSessionFactory sqlSessionFactory;
public User getUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
User user = sqlSession.selectOne("getUserById", id);
return user;
} finally {
sqlSession.close();
}
}
@Transactional
public void updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
sqlSession.update("updateUser", user);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}
```
在 getUserById 方法中手动关闭了 SqlSession,在 updateUser 方法中使用了 @Transactional 注解,使其变为事务操作,事务执行完毕后会自动关闭 SqlSession。
阅读全文