springboot2配置hikari多数据源(postgres版)
需求: 要把我们获取第三方的数据也推送到另外一个第三方公司的前置库里面(因为他们访问不到我们的项目 所以不能直接访问我们的接口,需要我们把数据插入到他们的表中,他们自己处理数据)
因此需要配置第二个数据源(参考的链接:https://www.jianshu.com/p/de58e1a384e9)
我的csdn:
可以参考我ycjyzhmispro项目的git提交(feat:配置第二数据源) 2023年9月27日14:12:30
1. pom.xml文件引入(其他数据库也可以借鉴,将依赖和properties中的驱动等数据修改测试即可)
postgresql依赖
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Hikari依赖(这两个依赖根据springboot版本自行加上版本)
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
一般情况下 不需要引入HikariCP,因为springboot默认就是用的HikariCP
2.数据库配置:
我只有一个数据源的配置如下:
spring:
config:
activate:
on-profile: default
datasource:
url: jdbc:postgresql://ip:端口/数据库
hikari:
username: **
password: **
maximum-pool-size: 4
driver-class-name: org.postgresql.Driver
要改为如下:
spring:
config:
activate:
on-profile: default
datasource:
type: com.zaxxer.hikari.HikariDataSource
master:
jdbc-url: jdbc:postgresql://ip:端口/数据库
username: **
password: **
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 4
slave:
jdbc-url: jdbc:postgresql://ip:端口/数据库
username: **
password: **
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 4
#是否开启第二数据源(这里因为在下面第二数据源配置中会获取这个值,来是否注入bean。特别注意:在第二数据源的mapper文件 自动注入的时候一定要加 @Autowired(required = false) 表示如果ThirdPartyPushDataRepository可用则自动注入,否则不会引发错误。
enabled: false
3.数据源代码配置
这两个配置类 要放在主启动的子包下面
3.0 说明一下:
1.
因为我的mapper文件 都是在 com.safesoft.domain.*.repository包下面,因此用了通配符,例如我的mapper包路径:com.safesoft.domain.system.repository.DepartmentRepository 或 com.safesoft.domain.rectification.repository.RectificationRepository
如图:
2.
我的mapper对应的xml在 resources下的mybatis包下面 例如src/main/resources/mybatis/abutment/abutmentTaxi.xml 或 src/main/resources/mybatis/earlyWarn/smsTemplate.xml
如图:
3.
注:==============================下面的mybatis配置需要注释掉
bean.setConfigLocation(new ClassPathResource(“mybatis.xml”));
在正常情况下,我们mybatis全局配置都是在配置文件进行的 如下application-default.yml
配置两个数据源的时候 就不生效了以下的配置,因此在配置类中定义
mybatis:
mapper-locations: classpath:mybatis/**/*.xml
config-location: classpath:mybatis.xml
3.1 主数据源配置类
package com.safesoft.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* [主数据源配置]
*
* @author Kevin.Wan
* @date 2023/9/26
**/
@Configuration
@MapperScan(basePackages = "com.safesoft.domain.*.repository", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterConfig {
/**
* 配置主数据源的数据源对象
*
* @return 主数据源的数据源对象
*/
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
@Primary
public DataSource masterDataSource() {
// 使用Spring Boot的DataSourceBuilder创建数据源
return DataSourceBuilder.create().build();
}
/**
* 配置主数据源的SqlSessionFactory
*
* @param dataSource 主数据源的数据源对象
* @return 主数据源的SqlSessionFactory
* @throws Exception 如果配置有误则抛出异常
*/
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 设置主数据源的Mapper文件路径,这里使用了通配符来匹配所有的XML文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/**/*.xml"));
// 设置主数据源的MyBatis全局配置文件路径
bean.setConfigLocation(new ClassPathResource("mybatis.xml"));
return bean.getObject();
}
/**
* 配置主数据源的事务管理器
*
* @param dataSource 主数据源的数据源对象
* @return 主数据源的事务管理器
*/
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 配置主数据源的SqlSessionTemplate
*
* @param sqlSessionFactory 主数据源的SqlSessionFactory
* @return 主数据源的SqlSessionTemplate
* @throws Exception 如果配置有误则抛出异常
*/
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
3.2 从数据源配置类
package com.safesoft.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* [从数据源配置]
*
* @author Kevin.Wan
* @date 2023/9/26
**/
@Configuration
@MapperScan(basePackages = "com.safesoft.domain.*.repository2", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
//注解@ConditionalOnProperty,这个注解能够控制某个configuration是否生效,这里的配置不要动,修改在properties文件中,往上看
@ConditionalOnProperty(prefix = "spring.datasource.slave", name = "enabled", havingValue = "true")
public class SlaveConfig {
/**
* 配置从数据源的数据源对象
*
* @return 从数据源的数据源对象
*/
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
// 使用Spring Boot的DataSourceBuilder创建数据源
return DataSourceBuilder.create().build();
}
/**
* 配置从数据源的SqlSessionFactory
*
* @param dataSource 从数据源的数据源对象
* @return 从数据源的SqlSessionFactory
* @throws Exception 如果配置有误则抛出异常
*/
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 设置从数据源的Mapper文件路径,这里使用了通配符来匹配所有的XML文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis2/**/*.xml"));
// 设置从数据源的MyBatis全局配置文件路径
bean.setConfigLocation(new ClassPathResource("mybatis.xml"));
return bean.getObject();
}
/**
* 配置从数据源的事务管理器
*
* @param dataSource 从数据源的数据源对象
* @return 从数据源的事务管理器
*/
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 配置从数据源的SqlSessionTemplate
*
* @param sqlSessionFactory 从数据源的SqlSessionFactory
* @return 从数据源的SqlSessionTemplate
* @throws Exception 如果配置有误则抛出异常
*/
@Bean(name = "slaveSqlSessionTemplate")
public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.事务处理,这里的事务只针对某一个数据源,关于两个数据库一起操作的回滚问题和分布式事务自行百度(我还没有用)
因为,我只需要把获取的数据插入第三方的数据库,将相关操作放在一个try-catch块中,并在catch块中捕获异常并记录错误日志,而不抛出异常。这样,如果插入第三方数据库失败,将不会中断代码的执行,而是继续执行后续代码。不影响咱们自己的系统为关键
5.注:mybatis.xml全局配置
看到这里 第二数据源已经配置完成了
这个一般项目中都有,不需要我们写,这里只是备注一下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeHandlers>
<typeHandler javaType="Boolean" jdbcType="CHAR" handler="com.safesoft.config.SSiBooleanTypeHandler"/>
</typeHandlers>
</configuration>
ttings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeHandlers>
<typeHandler javaType="Boolean" jdbcType="CHAR" handler="com.safesoft.config.SSiBooleanTypeHandler"/>
</typeHandlers>
</configuration>