mybatis-plus引入多个数据源sql执行不释放连接
时间: 2023-08-04 15:37:57 浏览: 216
这个问题可能是由于数据源连接没有正确释放所导致的。在 MyBatis Plus 中,可以通过配置多个数据源来实现多数据源的支持。但是,如果在使用多个数据源时,没有正确释放连接,就会导致连接池中的连接被占满,最终导致应用程序无法正常工作。
为了解决这个问题,你可以尝试以下几个方案:
1. 确认每个数据源的连接数是否正确配置,以及连接池的最大连接数是否足够。
2. 确认每个数据源的连接是否正确释放。可以在代码中使用 try-with-resources 语句来确保连接正确释放:
```
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// do something
}
```
3. 如果以上两个方案都不能解决问题,可以考虑在 MyBatis Plus 的配置文件中添加以下参数:
```
mybatis.configuration.proxyFactory=com.baomidou.mybatisplus.core.override.MybatisDefaultParameterHandlerFactory
```
这个参数可以解决 MyBatis Plus 在使用多个数据源时,无法正确释放连接的问题。
希望这些解决方案能帮到你!
相关问题
mybatis-plus切换多数据源
Mybatis-Plus是一个基于Mybatis的增强工具,它为Mybatis提供了很多增强功能,其中之一就是支持多数据源的切换。下面介绍一下如何在Mybatis-Plus中切换多数据源:
1. 配置多数据源
在Spring Boot项目的配置文件application.yml中,可以配置多个数据源,例如:
```
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/master
username: root
password: root
slave:
url: jdbc:mysql://localhost:3306/slave
username: root
password: root
```
2. 创建多数据源配置类
创建一个多数据源的配置类,用于配置多个数据源,例如:
```
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
}
```
3. 创建动态数据源
在Mybatis-Plus中,需要使用动态数据源来实现多数据源的切换,可以创建一个DynamicDataSource类来实现。该类需要继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法,例如:
```
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
4. 创建数据源上下文
在切换数据源时,需要设置当前使用的数据源。可以使用ThreadLocal来保存当前使用的数据源,例如:
```
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
```
5. 配置SqlSessionFactory
在Spring Boot项目中,可以使用SqlSessionFactory来创建数据库连接和执行SQL语句。需要配置SqlSessionFactory来支持多数据源切换,例如:
```
@Configuration
public class MybatisConfig {
@Autowired
private DataSourceConfig dataSourceConfig;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource());
sessionFactory.setTypeAliasesPackage("com.example.entity");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public DynamicDataSource dynamicDataSource() {
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", dataSourceConfig.masterDataSource());
dataSourceMap.put("slave", dataSourceConfig.slaveDataSource());
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(dataSourceConfig.masterDataSource());
return dynamicDataSource;
}
}
```
6. 切换数据源
在需要切换数据源的地方,可以调用DataSourceContextHolder.setDataSourceKey方法来设置当前使用的数据源的key。例如:
```
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
DataSourceContextHolder.setDataSourceKey("slave");
List<User> userList = userMapper.selectList(null);
DataSourceContextHolder.clearDataSourceKey();
return userList;
}
}
```
mybatis-plus 获取当前数据源类型
在 MyBatis-Plus 中,可以通过 `DataSourceUtils` 类的 `getDbType()` 方法来获取当前数据源的类型。
以下是一个示例:
```java
import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
public class Main {
public static void main(String[] args) {
String dbType = SqlUtils.getDbType(dataSource);
System.out.println("当前数据源类型为:" + dbType);
}
}
```
其中,`dataSource` 是你的数据源对象,可以是 `javax.sql.DataSource` 或者其他支持的数据源类型。
执行以上代码,就可以获取到当前数据源的类型。常见的数据源类型包括 MySQL、Oracle、SQL Server 等。
阅读全文