介绍:之前写了一篇博客关于mysql的读写分离,那个需要配置多个类,如今读写分离升级了,我们不需要配置任何java配置文件类就可以,因为有人为我们封装了,我们只管添加依赖就好了。
注意:如果您看的不明白,可以去看下之前我写的读写分离,会发现简单很多,读写分离Mysql
1、添加pom依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>2.7.0</version> </dependency>
添加三个依赖,dynamic-datasource-spring-boot-starter 这个是数据库读写分离的主要依赖,druid-spring-boot-starter 我们使用druid数据库连接池,从库默认HikariCP数据库连接池,Springboot默认数据库连接池就是HikariCP
2、添加配置文件
spring: datasource: druid: stat-view-servlet: loginUsername: admin loginPassword: 123456 dynamic: master: username: password: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/point02?characterEncoding=utf8&useSSL=false druid: initial-size: 3 max-active: 8 min-idle: 2 max-wait: -1 min-evictable-idle-time-millis: 30000 max-evictable-idle-time-millis: 30000 time-between-eviction-runs-millis: 0 validation-query: select 1 validation-query-timeout: -1 test-on-borrow: false test-on-return: false test-while-idle: true pool-prepared-statements: true max-open-prepared-statements: 100 filters: stat,wall share-prepared-statements: true slave: one: username: password: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/point02?characterEncoding=utf8&useSSL=false two: username: password: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/point02?characterEncoding=utf8&useSSL=false druid: initial-size: 2 max-active: 6 three: username: password: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/score?characterEncoding=utf8&useSSL=false druid: initial-size: 3 max-active: 10 initialization-mode: always
3、使用 @DS 切换数据源
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议注解在service实现或mapper接口方法上。
注解 | 结果 |
---|---|
没有@DS | 主库 |
@DS("slave") | 存在slave指定slave,不存在主库 |
@DS | 根据DynamicDataSourceStrategy策略,选择一个从库。默认负载均衡策略。 |
注意 | force-master 会判断当前方法和类上是否有@Transational注解,如果有会强制主 |
@DS("one") @DS("two") | 表示使用的从库,one指使用从库one,two之使用从库two指的数据库 |
@DS public interface UserMapper { @Insert("INSERT INTO t_employee (name,cert_num) values (#{name},#{age})") boolean addUser(@Param("name") String name, @Param("age") Integer age); @Update("UPDATE t_employee set name=#{name}, cert_num=#{age} where employee_id =#{id}") boolean updateUser(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age); @Delete("DELETE from t_employee where employee_id =#{id}") boolean deleteUser(@Param("id") Integer id); @Select("SELECT * FROM t_employee") List<User> selectAll(); }
@DS("three") public interface ScoreMapper { @Select({ "select * from d_import_original_mobile" }) List<Mobile> getAll(); }
在mapper分别使用不同的数据源,到最后我们都可以成功,然而,如果你使用的是xml方式的话,您可以把注解加在service层上就可以,最后写controller,就可以成功。
4、官方详解
感谢各位大牛的努力成果,详解请点击
5、总结
三个依赖+一个配置文件+一个注解(@DS)==实现mysql读写分离。
来源:oschina
链接:https://my.oschina.net/u/3209213/blog/1859236