Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@296aabd] 2025-03-27T22:23:56.225+08:00 WARN 13468 --- [nio-8080-exec-2] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.example.uavmanager.controller.EditController.ProtocolController protocolId:1 projectId:1 pageNum:1 pageSize:10 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e1bdf1d] was not registered for synchronization because synchronization is not active Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e1bdf1d] 确认是mapper出了问题 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.uavmanager.mapper.ProtocolMapper"> <!--动态sql--> <select id="list" resultType="com.example.uavmanager.entity.Protocol"> select * from t_protocol <where> <if test="protocolId!=null"> N_PROTOCOL_ID=#{protocolId} </if> <if test="projectId!=null"> and N_PROJECT_ID=#{projectId} </if> </where> </select> </mapper>public interface ProtocolMapper { List<Protocol> list(Integer protocolId, Integer projectId); }@Data @TableName("t_protocol") public class Protocol { @TableId(value = "N_PROTOCOL_ID", type = IdType.AUTO) private Integer protocolId; @TableField("N_PROJECT_ID") private Integer projectId; @TableField("VC_NAME") private String name; @TableField("VC_VERSION") private String version; @TableField("D_CREATE") private String createTime; // 使用字符串类型 @TableField("N_STATUS") private Integer status; @TableField("D_RELEASE") private String releaseTime; // 使用字符串类型 @TableField("VC_EXCEL_PATH") private String excelPath; @TableField("VC_XML_PATH") private String xmlPath; @TableField("VC_DESC") private String desc; }
时间: 2025-07-13 13:40:25 浏览: 6
<think>好的,我现在需要帮用户解决关于MyBatis出现“Closing non transactional SqlSession”警告的问题。首先,我得仔细分析用户提供的日志和代码,找出可能的原因。
用户提供的日志中有两个警告:一个是关于参数名解析的,另一个是SqlSession未被注册同步而被关闭。用户怀疑是Mapper文件的问题,所以重点应该放在MyBatis的配置和使用上。
首先看日志中的“Closing non transactional SqlSession”。这个警告通常表示MyBatis的SqlSession没有被Spring的事务管理所管理,可能是因为没有启用事务管理或者方法没有被事务注解标记。用户可能没有在Spring Boot配置中启用事务管理,或者在调用Mapper的方法时没有使用@Transactional注解,导致SqlSession在操作后立即关闭,而不是由事务管理器来管理。
接下来看用户的Mapper XML文件。里面的动态SQL查询看起来没问题,where标签和if条件正确使用了参数protocolId和projectId。但要注意的是,如果传入的参数中有null值,可能会导致查询条件不准确,但这可能不会直接导致SqlSession的警告。
然后看ProtocolMapper接口,方法定义为list(Integer protocolId, Integer projectId),这里使用了多个参数,而MyBatis在3.4.0之前需要@Param注解来明确参数名,否则可能会按顺序(param1, param2)引用。如果用户的MyBatis版本较低,而接口方法又没有使用@Param注解,可能导致参数绑定错误,从而引发异常或警告。不过用户提供的XML中使用的是#{protocolId}和#{projectId},所以需要确认参数是否正确传递。
另外,用户的实体类Protocol使用了@TableName和@TableField注解,这可能是MyBatis-Plus的注解,说明项目可能集成了MyBatis-Plus。如果同时配置了MyBatis和MyBatis-Plus,可能存在配置冲突,需要检查配置是否正确,比如是否启用了事务管理器。
再考虑事务管理的问题。Spring Boot默认会配置事务管理器,但需要确保在启动类上添加了@EnableTransactionManagement,或者在配置类中正确配置了事务管理器。如果用户没有正确配置事务,可能导致SqlSession无法被同步管理,从而出现警告。
还有,用户提到的日志中有一个关于“-debug”参数名解析的警告,这可能是因为编译时没有使用-parameters选项,导致MyBatis在解析参数名时使用了旧的方法。建议用户在编译时添加该选项,或者在接口方法参数前添加@Param注解,明确指定参数名,以避免此类警告。
总结可能的问题点:
1. 缺少事务管理配置,导致SqlSession未被同步管理。
2. Mapper接口方法参数未使用@Param注解,导致参数绑定问题。
3. MyBatis版本较低,需要更新或调整参数绑定方式。
4. MyBatis-Plus和MyBatis配置冲突,需要检查配置。
5. 编译选项未添加-parameters,导致参数名解析问题。
解决方案可能包括:
- 在Spring Boot配置中启用事务管理。
- 在Mapper接口方法参数添加@Param注解。
- 检查MyBatis和MyBatis-Plus的配置是否冲突。
- 更新MyBatis版本或调整编译选项。
- 确保Service层方法使用@Transactional注解。
需要逐步排除这些可能性,找到具体的根本原因,然后给出相应的解决步骤。</think>根据日志和代码分析,出现`Closing non transactional SqlSession`警告的根本原因及解决方案如下:
---
### 一、问题定位
#### 1. **事务未启用**
- **现象**:日志提示`SqlSession was not registered for synchronization because synchronization is not active`,说明MyBatis未启用Spring事务管理。
- **原因**:调用Mapper方法时未通过`@Transactional`注解开启事务,或Spring事务管理器未正确配置。
#### 2. **Mapper接口参数问题**
- **现象**:动态SQL中直接使用`#{protocolId}`,但接口方法参数未标注`@Param`。
- **原因**:MyBatis默认通过参数索引(`param1, param2`)绑定参数,若未明确指定名称,可能导致参数绑定失败。
#### 3. **MyBatis-Plus整合问题**
- **现象**:实体类使用了MyBatis-Plus注解(如`@TableName`),但未确认是否配置了事务管理器。
- **原因**:若同时混用MyBatis原生API和MyBatis-Plus,需确保事务管理器兼容。
---
### 二、解决方案
#### 步骤1:启用Spring事务管理
1. **添加事务注解**
在Service层方法上添加`@Transactional`:
```java
@Service
public class ProtocolService {
@Transactional // 启用事务管理
public List<Protocol> listProtocols(Integer protocolId, Integer projectId) {
return protocolMapper.list(protocolId, projectId);
}
}
```
2. **检查事务配置**
确保Spring Boot启动类已启用事务:
```java
@SpringBootApplication
@EnableTransactionManagement // 启用事务管理
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
---
#### 步骤2:修复Mapper接口参数绑定
在Mapper接口中为参数添加`@Param`注解:
```java
public interface ProtocolMapper {
List<Protocol> list(
@Param("protocolId") Integer protocolId,
@Param("projectId") Integer projectId
);
}
```
---
#### 步骤3:验证MyBatis-Plus配置
1. **检查依赖**
确保`pom.xml`中已正确引入MyBatis-Plus Starter:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
```
2. **配置事务管理器**
在`application.yml`中确认MyBatis-Plus配置:
```yaml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 可选:开启SQL日志
```
---
#### 步骤4:修复参数名解析警告
1. **编译时添加`-parameters`选项**
在Maven编译插件中配置:
```xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
```
2. **或使用`@Param`注解替代**
如步骤2所示,显式标注参数名称。
---
### 三、验证结果
1. 事务管理生效后,日志中应不再出现`Closing non transactional SqlSession`警告。
2. 参数绑定正确时,动态SQL能按预期拼接条件。
3. 参数名解析警告消失。
---
### 四、扩展建议
- **日志调试**:开启MyBatis SQL日志(配置`mybatis-plus.configuration.log-impl=StdOutImpl`)检查SQL执行过程。
- **代码规范**:建议所有Mapper接口参数均使用`@Param`注解,避免隐式依赖参数顺序。
阅读全文
相关推荐


















