根据实现SimpleJob类来完成定时同步信息的任务时,为什么会报:Closing non transactional SqlSession
时间: 2024-10-24 09:04:09 浏览: 26
dynamic-schedule:springboot 动态定时任务
当基于`SimpleJob`类来完成定时任务,比如从数据库中同步数据,如果遇到这样的错误提示`Closing non transactional SqlSession`,原因通常是你的代码试图在一个非事务上下文中关闭了一个事务性的SQL会话(`SqlSession`)。`SimpleJob`默认是用于非事务处理的,如果你的业务操作涉及数据库交互,并且你期望这些操作是原子性的,即在事务边界下执行,那么你需要确保在`execute()`方法内开启了事务,或者将整个作业封装在事务管理的代码块中。
例如,如果你使用MyBatis或者JDBC,你可能会在`execute()`方法内部创建一个新的`SqlSession`然后手动开启事务,但在作业完成后忘记关闭它,就会导致这种错误。正确的做法是在事务开始后立即打开`SqlSession`,并在事务结束时手动关闭:
```java
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Override
public void execute() throws Exception {
TransactionContext context = TransactionContextHolder.getTxContext();
if (context == null) {
// 手动开启事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
try {
// 在这里执行数据库操作...
// 使用sqlSession进行查询、插入等操作
// ...
sqlSession.commit(); // 结束事务
} finally {
sqlSession.close(); // 关闭连接
}
} else {
// 如果已有事务,直接在事务上下文中执行
SqlSession sqlSession = context.getSession();
// ...
}
}
```
阅读全文