关于

有时候,随着业务的发展,项目关联的数据来源会变得越来越复杂,使用的数据库会比较分散,这个时候就会采用多数据源的方式来获取数据。另外,多数据源也有其他好处,例如分布式数据库的读写分离,集成多种数据库等等。

下面分享我在实际项目中配置多数据源的案例。话不多说了,来一起看看详细的介绍吧

步骤

1.application.yml文件中,配置数据库源。这里primary是主库,secondary是从库。

 server:
port: 8089 # 多数据源配置
#primary
spring:
primary:
datasource:
url: jdbc:mysql://127.0.0.1:3306/database1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
username: root
password: ******
driver-class-name: com.mysql.jdbc.Driver #secondary
secondary:
datasource:
url: jdbc:mysql://127.0.0.1:3306/database1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
username: root
password: ******
driver-class-name: com.mysql.jdbc.Driver jpa:
hibernate:
primary-dialect: org.hibernate.dialect.MySQL5Dialect
secondary-dialect: org.hibernate.dialect.MySQL5Dialect
open-in-view: true
show-sql: true

application.yml

2.创建一个Spring配置类,其中spring.primary.datasource的路径参考yml文件的配置。

 @Configuration
public class DataSourceConfig { @Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix="spring.primary.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
} @Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@Primary
@ConfigurationProperties(prefix="spring.secondary.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
} }

DataSourceConfig

3.分别创建主库、从库的配置类。

注意:entity包和dao包的配置,以及@Primary注解指定主库。

主库配置类:

 @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"com.infinitus.yunxiao_data.dao.primary"}) //设置Repository所在位置
public class PrimaryConfig {
@Autowired
private JpaProperties jpaProperties; @Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource; @Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
} @Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource)
.properties(getVendorProperties(primaryDataSource))
.packages("com.infinitus.yunxiao_data.entity.primary") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
} private Map getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
} @Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}

主库配置

从库的配置类:

 @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary",
basePackages = {"com.infinitus.yunxiao_data.dao.secondary"}) //设置Repository所在位置
public class SecondaryConfig {
@Autowired
private JpaProperties jpaProperties; @Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource; @Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
} @Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
.properties(getVendorProperties(secondaryDataSource))
.packages("com.infinitus.yunxiao_data.entity.secondary") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
} private Map getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
} @Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
} }

从库配置

4.分别创建主、从库dao类。

主dao:

 @Repository
public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> { @Query(value = "SELECT p FROM PrimaryEntity p")
List<PrimaryEntity> queryList(); }

主dao

从dao:

 @Repository
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> { @Query(value = "SELECT p FROM SecondaryEntity p")
List<SecondaryEntity> queryList(); }

从dao

5.分别创建主、从库entity类。

主entity:

 @Entity
@Table(name = "holiday_scheme")
@EntityListeners(AuditingEntityListener.class)
public class PrimaryEntity extends AbstractPersistable<Long> {
@Column(name = "date")
public String date;
@Column(name = "hour")
public String hour;
@Column(name = "holiday")
public String holiday;
@Column(name = "holiday_explain")
public String holiday_explain; public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getHour() {
return hour;
} public void setHour(String hour) {
this.hour = hour;
} public String getHoliday() {
return holiday;
} public void setHoliday(String holiday) {
this.holiday = holiday;
} public String getHoliday_explain() {
return holiday_explain;
} public void setHoliday_explain(String holiday_explain) {
this.holiday_explain = holiday_explain;
} @Override
public String toString() {
return "PrimaryEntity{" +
"date='" + date + '\'' +
", hour='" + hour + '\'' +
", holiday='" + holiday + '\'' +
", holiday_explain='" + holiday_explain + '\'' +
'}';
}
}

主Entity

从entity:

 @Entity
@Table(name = "active_dashboards")
@EntityListeners(AuditingEntityListener.class)
public class SecondaryEntity extends AbstractPersistable<Long> { @Column(name = "dashboard_id")
public String dashboard_id;
@Column(name = "user_id")
public String user_id;
@Column(name = "order_index")
public String order_index; public String getDashboard_id() {
return dashboard_id;
} public void setDashboard_id(String dashboard_id) {
this.dashboard_id = dashboard_id;
} public String getUser_id() {
return user_id;
} public void setUser_id(String user_id) {
this.user_id = user_id;
} public String getOrder_index() {
return order_index;
} public void setOrder_index(String order_index) {
this.order_index = order_index;
} @Override
public String toString() {
return "SecondaryEntity{" +
"dashboard_id='" + dashboard_id + '\'' +
", user_id='" + user_id + '\'' +
", order_index='" + order_index + '\'' +
'}';
}
}

从Entity

6.controller请求获取不同数据库的数据。

 @RestController
@RequestMapping("/database")
public class MailController {
private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
PrimaryRepository primaryRepository;
@Autowired
SecondaryRepository secondaryRepository; @RequestMapping("/primary")
@ResponseBody
public String primary() {
return primaryRepository.queryList().toString();
} @RequestMapping("/secondary")
@ResponseBody
public String secondary() {
return secondaryRepository.queryList().toString();
} }

Controller

注意

下面提两个在配置多数据源时遇到的坑点,一不注意就掉坑了。

1.Application类不需要配置@EnableJpaRepositories注解,会报如下错误。

A component required a bean named 'entityManagerFactory' that could not be f

2.注意检查dao类,获取数据的方法上格式是否正确,有没有某个字段是表中不存在的,避免启动异常。如下,SecondaryEntity表中是不存在job_name字段的,所以注释掉才能启动成功等。

 //@Query(value = "SELECT p FROM SecondaryEntity p where p.job_name = ?1")
//List<SecondaryEntity> queryOdcRecord(String job_name);

转自:http://blog.csdn.net/yuechang5/article/details/53471743

https://baomidou.oschina.io/mybatis-plus-doc/#/multi-datasource

https://blog.csdn.net/husong_/article/details/80103497

https://www.cnblogs.com/hdwang/p/7041096.html

https://www.jb51.net/article/154301.htm

spring boot Mybatis多数据源配置的更多相关文章

  1. spring boot mybatis 多数据源配置

    package com.xynet.statistics.config.dataresources; import org.springframework.jdbc.datasource.lookup ...

  2. Spring Boot + Mybatis 多数据源配置实现读写分离

    本文来自网易云社区 作者:王超 应用场景:项目中有一些报表统计与查询功能,对数据实时性要求不高,因此考虑对报表的统计与查询去操作slave db,减少对master的压力. 根据网上多份资料测试发现总 ...

  3. spring boot mybatis多多数据源解决方法

    在我们的项目中不免会遇到需要在一个项目中使用多个数据源的问题,像我在得到一个任务将用户的聊天记录进行迁移的时候,就是用到了三个数据源,当时使用的AOP的编程方式根据访问的方法的不同进行动态的切换数据源 ...

  4. spring boot +mybatis(通过properties配置) 集成

    注:日常学习记录贴,下面描述的有误解的话请指出,大家一同学习. 因为我公司现在用的是postgresql数据库,所以我也用postgresql进行测试 一.前言 1.Spring boot 会默认读取 ...

  5. Spring MVC+Mybatis 多数据源配置

    文章来自:https://www.jianshu.com/p/fddcc1a6b2d8 1. 继承AbstractRoutingDataSource AbstractRoutingDataSource ...

  6. spring boot jpa 多数据源配置

    在实际项目中往往会使用2个数据源,这个时候就需要做额外的配置了.下面的配置在2.0.1.RELEASE 测试通过 1.配置文件 配置两个数据源 spring.datasource.url=jdbc:m ...

  7. spring boot + mybatis + druid配置实践

    最近开始搭建spring boot工程,将自身实践分享出来,本文将讲述spring boot + mybatis + druid的配置方案. pom.xml需要引入mybatis 启动依赖: < ...

  8. Spring Boot 2.X(五):MyBatis 多数据源配置

    前言 MyBatis 多数据源配置,最近在项目建设中,需要在原有系统上扩展一个新的业务模块,特意将数据库分库,以便减少复杂度.本文直接以简单的代码示例,如何对 MyBatis 多数据源配置. 准备 创 ...

  9. Spring Boot + Mybatis 配置多数据源

    Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...

随机推荐

  1. git提交node-modules报文件名过长无法提交问题

    当报如下错误时候 fatal: unable to stat 'node_modules/gulp-connect/node_modules/gulp-util/node_modules/datefo ...

  2. 如何应用r.js对requirejs下的js代码合并

    1.在根目录新建build.js ({ baseUrl:'js', paths:{ jquery:'static/jquery-1.10.2.min', underscore:'static/unde ...

  3. dedecms--将静态页面转化为动态页面

    最近在用dedecms二次开发项目,需要对文章内容页设置权限,会员未登录不允许查看,这个需要先在后台设置将静态页面转化为动态页面 具体步骤: 1:将主页设置为动态浏览 2:进入后台→系统→SQL命令行 ...

  4. 搭建redis集群时所遇问题及解决方法

    单独一台虚拟机(系统CentOS 7) 问题1 创建redis集群环境时,输入以下命令 [root@localhost redis-cluster]# ./redis-trib.rb create - ...

  5. python re的findall和finditer

    记录一个现象: 今天在写程序的时候,发现finditer和findall返回的结果不同.一个为list,一个为iterator. 红色箭头的地方,用finditer写的时候,print(item.gr ...

  6. es6 --数组--Array.from() 、Array.isArray()、Array.of()、find()、findIndex()、fill()、entries() 、keys() ,values()

    将两类对象转为真正的数组 Array.from()方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Se ...

  7. bitShark对Android版本的支持

    bitShark对Android版本的支持   bitShark是一款轻量级的Android数据抓包软件.使用该软件,可以随时随地抓取网络中的各种数据包,并进行各项分析.我们推出的bitShark手机 ...

  8. proc_get_status() has been disabled for security reasons

    找到php.ini搜索proc_get_status去掉即可.

  9. JFinal学习 & Gradle配置续 & Tomcat配置

    接上一篇对Gradle的学习,再用JFinal项目再建一个. 参考了这篇文章:https://my.oschina.net/u/1010578/blog/390094 但是其中没有代码,所以看了这篇  ...

  10. minimum-moves-to-equal-array-elements-ii(好)

    https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ package com.company; import ...