弹簧引导+ mybatis实现数据库读写分离的示例

  介绍

小编给大家分享一下弹簧引导+ mybatis实现数据库读写分离的示例,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

<强>介绍

随着业务的发展,除了拆分业务模块外,数据库的读写分离也是常见的优化手段。

方案使用了AbstractRoutingDataSource和mybatis插件来动态的选择数据源

选择这个方案的原因主要是不需要改动原有业务代码,非常友好

<强>注:

演示中使用了mybatis-plus,实际使用mybatis也是一样的
示例中使用的数据库是postgres、实际任一类型主从备份的数据库示例都是一样的
示例中使用了阿里巴巴的德鲁伊教团员数据源,实际其他类型的数据源也是一样的

<强>环境

首先,我们需要两个数据库实例,一为大师,一为奴隶。

所有的写操作,我们在主节点上操作

所有的读操作,我们在奴隶节点上操作

<强>需要注意的是:对于一次有读有写的事务,事务内的读操作也不应该在奴隶节点上,所有操作都应该在主节点上
先跑起来两个pg的实例,其15432年中端口对应的主节点,15433端口对应的奴隶节点:

docker  run  \   ——name  pg-master  \   -p  15432:5432  \   ,——env  & # 39; PG_PASSWORD=postgres # 39; \   ,——env  & # 39; REPLICATION_MODE=主# 39;\   ,——env  & # 39; REPLICATION_USER=repluser& # 39; \   ——env 才能& # 39;REPLICATION_PASS=repluserpass& # 39; \   -d  sameersbn/postgresql: 10 - 2      docker  run  \   ——name  pg-slave  \   -p  15433:5432  \   ,——link  pg-master: master  \   ,——env  & # 39; PG_PASSWORD=postgres # 39; \   ,——env  & # 39; REPLICATION_MODE=奴隶# 39;\   ,——env  & # 39; REPLICATION_SSLMODE=喜欢# 39;\   ,——env  & # 39; REPLICATION_HOST=主# 39;\   ,——env  & # 39; REPLICATION_PORT=5432 & # 39; \   ,——env  & # 39; REPLICATION_USER=repluser& # 39; \   ——env 才能& # 39;REPLICATION_PASS=repluserpass& # 39; \   10,-d  sameersbn/postgresql:

<强>实现

整个实现主要有3个部分:

<李>

配置两个数据源

<李>

实现AbstractRoutingDataSource来动态的使用数据源

<李>

实现mybatis插件来动态的选择数据源

<强>配置数据源

将数据库连接信息配置到应用程序。yml文件中

春:   ,mvc:   servlet才能:   ,,路径:/api      数据源:   ,写:   driver-class-name才能:org.postgresql.Driver   ,,url:“$ {DB_URL_WRITE: jdbc: postgresql://localhost: 15432/postgres}“;   用户名:,才能“$ {DB_USERNAME_WRITE: postgres}“;   ,,密码:“$ {DB_PASSWORD_WRITE: postgres}“;   ,上面写着:   driver-class-name才能:org.postgresql.Driver   ,,url:“$ {DB_URL_READ: jdbc: postgresql://localhost: 15433/postgres}“;   用户名:,才能“$ {DB_USERNAME_READ: postgres}“;   ,,密码:“$ {DB_PASSWORD_READ: postgres}“;         mybatis-plus:   ,配置:   map-underscore-to-camel-case:,才能真正的

写写数据源,对应到主节点的15432端口

阅读读数据源,对应到奴隶节点的15433端口

将两个数据源信息注入为DataSourceProperties:

@ configuration   public  class  DataSourcePropertiesConfig  {      @Primary才能   @ bean才能(“writeDataSourceProperties")   @ConfigurationProperties才能(“datasource.write")   public 才能;DataSourceProperties  writeDataSourceProperties (), {   ,,,return  new  DataSourceProperties ();   ,,}      @ bean才能(“readDataSourceProperties")   @ConfigurationProperties才能(“datasource.read")   public 才能;DataSourceProperties  readDataSourceProperties (), {   ,,,return  new  DataSourceProperties ();   ,,}   }

<>强实现AbstractRoutingDataSource

春提供了AbstractRoutingDataSource,提供了动态选择数据源的功能,替换原有的单一数据源后,即可实现读写分离:

@ component   public  class  CustomRoutingDataSource  extends  AbstractRoutingDataSource  {      @才能(=name “writeDataSourceProperties")   private 才能;DataSourceProperties  writeProperties;      @才能(=name “readDataSourceProperties")   private 才能;DataSourceProperties  readProperties;         @Override才能   public 才能;void  afterPropertiesSet (), {   ,,,DataSource  writeDataSource =,   ,,,,,writeProperties.initializeDataSourceBuilder () .type (DruidDataSource.class) .build ();   ,,,DataSource  readDataSource =,   ,,,,,readProperties.initializeDataSourceBuilder () .type (DruidDataSource.class) .build ();   ,,,,   ,,,setDefaultTargetDataSource (writeDataSource);      ,,,Map

弹簧引导+ mybatis实现数据库读写分离的示例