org.projectlombok
lombok
true
cn.hutool
hutool-all
5.4.5
🟡 4.3 项目配置
项目启动端口
server:
port: 9090
项目 名称
spring:
application:
name: multi-datasource-instance
datasource:
主数据库
master:
注意,整合多数据源时如果使用springboot默认的数据库连接池Hikari,指定连接数据使用的是jdbc-url而不是url属性
jdbc-url: jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
副数据库
slave:
注意,整合多数据源时如果使用springboot默认的数据库连接池Hikari,指定连接数据使用的是jdbc-url而不是url属性
jdbc-url: jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
🟢 4.4 编写主副数据库数据源配置
1、主数据源相关配置:
主要是指定主数据源、扫描的mapper地址、事务管理器等信息。
@Configuration
// 指定主数据库扫描对应的Mapper文件,生成代理对象
@MapperScan(basePackages =“com.diary.it.multi.datasource.mapper” ,sqlSessionFactoryRef = “masterSqlSessionFactory”)
public class MasterDataSourceConfig {
// mapper.xml所在地址
private static final String MAPPER_LOCATION = “classpath*:mapper/*.xml”;
/**
-
主数据源,Primary注解必须增加,它表示该数据源为默认数据源
-
项目中还可能存在其他的数据源,如获取时不指定名称,则默认获取这个数据源,如果不添加,则启动时候回报错
*/
@Primary
@Bean(name = “masterDataSource”)
// 读取spring.datasource.master前缀的配置文件映射成对应的配置对象
@ConfigurationProperties(prefix = “spring.datasource.master”)
public DataSource dataSource() {
DataSource build = DataSourceBuilder.create().build();
return build;
}
/**
- 事务管理器,Primary注解作用同上
*/
@Bean(name = “masterTransactionManager”)
@Primary
public PlatformTransactionManager dataSourceTransactionManager(@Qualifier(“masterDataSource”) DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
- session工厂,Primary注解作用同上
*/
@Bean(name = “masterSqlSessionFactory”)
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier(“masterDataSource”) DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));
return sessionFactoryBean.getObject();
}
}
2、副数据源相关配置:
主要是指定数据源、扫描的mapper地址、事务管理器等信息。
@Configuration
// 指定从数据库扫描对应的Mapper文件,生成代理对象
@MapperScan(basePackages = “com.diary.it.multi.datasource.mapper2”, sqlSessionFactoryRef = “slaveSqlSessionFactory”)
public class SlaveDataSourceConfig {
// mapper.xml所在地址
private static final String MAPPER_LOCATION = “classpath*:mapper2/*.xml”;
/**
- 数据源
*/
@Bean(name = “slaveDataSource”)
// 读取spring.datasource.slave前缀的配置文件映射成对应的配置对象
@ConfigurationProperties(prefix = “spring.datasource.slave”)
public DataSource dataSource() {
DataSource build = DataSourceBuilder.create().build();
return build;
}
/**
- 事务管理器
*/
@Bean(name = “slaveTransactionManager”)
public PlatformTransactionManager dataSourceTransactionManager(@Qualifier(“slaveDataSource”) DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
- session工厂
*/
@Bean(name = “slaveSqlSessionFactory”)
public SqlSessionFactory sqlSessionFactory(@Qualifier(“slaveDataSource”) DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SlaveDataSourceConfig.MAPPER_LOCATION));
return sessionFactoryBean.getObject();
}
}
4.5 执行结果
完成上面的步骤后,就跟我们平常写业务逻辑的方式一样,在service中写业务逻辑,在mapper中写sql语句等,下面看看执行结果!
4.6 整合中遇到的问题
看完上面的教程,是不是发现其实整合多数据源其实也挺简单的!但是,完全按照教学流程整合还是遇到各种问题的现象真的太常见了,下面博主就总结下整合中遇到的各种问题
,如果你在整合过程中也遇到了,可以直接按照博主的解决方案来哦(贴心吧!)。
问题1、出现 jdbcUrl is required with driverClassName异常
原因: SpringBoot2.x后默认的数据库连接池就是HikariCP(号称史上最快,性能最高),HikariCP连接池中命名规则和其他的连接池不太一样,指定连接数据库的地址时,它使用的是jdbc-url而不是url,所以如果我们不指定数据库连接池如druid而使用springboot默认的连接池的话,需要将配置中连接数据库的url改成jdbc-url属性。
问题2、 出现 Invalid bound statement (not found)异常
原因:
(1)、在定义数据源配置信息时没有指定SqlSessionFactoryBean扫描的mapper.xml文件的位置即 sessionFactoryBean.setMapperLocations(xxx)。
(2)、mapper.xml文件中namespace属性对应的路径不准确或者对应方法的id名称、parameterType属性不对
(3)、xxxMapper.java的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType
问题3、 出现 required a single bean, but 2 were found异常
原因: 因为我们在指定主副数据源配置时已经使用MapperScan注解进行扫描对应的mapper.java,此时被扫描到的mapper.java已经生成代理类到Spring容器,如果此时在启动类中再使用MapperScan扫描则会成出现上面的问题(奇怪的是:这个问题我换一台电脑就不报错了,所以出现这个问题先按照这个方案解决吧)
问题4、 主数据源配置类中为什么添加Primary注解
原因: 因为整合了多数据源,所以DataSource、PlatformTransactionManager等实例都会注入多个到Spring容器中,Primary注解的作用就是:当我们使用自动配置的方式如Autowired注入Bean时,如果这个Bean有多个候选者,如果其中一个候选者具有@Primary注解修饰,该候选者会被选中,作为自动配置的值。
问题5、 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别
原因: 细心的小伙伴会发现,在数据库配置中driver-class-name属性的值为com.mysql.cj.jdbc.Driver,其实com.mysql.jdbc.Driver 是 对应mysql-connector-java 5驱动的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及之后的数据库驱动的,如果使用了6.x后的mysql数据库驱动还继续使用com.mysql.jdbc.Driver 则启动时会报deprecated(过时的),同时使用mysql6.x后的驱动需要指定时区serverTimezone:
五、SpringBoot+Mybatis-Plus整合多数据源
===============================
上面Mybatis使用分包的方式整合多数据源多少还是有些麻烦的,但是使用MyBatis-Plus就比较简单了,MyBatis-Plus官方就支持了多数据源,使用的时候只需要一个注解就可以实现,整合多数据源的时候推荐使用该种方式。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
《Java高级架构知识》
《算法知识》
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
95254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
[外链图片转存中…(img-G6003PA0-1712078533499)]
《Java高级架构知识》
[外链图片转存中…(img-BxlK4cCZ-1712078533500)]
《算法知识》
[外链图片转存中…(img-9hWlWoIM-1712078533500)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!