Sharding-JDBC多数据源配置并实现读写分离
官方简介
官方文档
定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
- 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
- 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
hikari数据源
Hikari是一款非常强大,高效,并且号称“史上最快连接池”。并且在springboot2.0之后,采用的默认数据库连接池就是Hikari。不需要引入依赖,已经在SpringBoot中包含了。
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
application.yml
sharding:
jdbc:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: ***
password: ***
hikari:
maximum-pool-size: 60
idle-timeout: 60000
connection-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
minimum-idle: 10
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: ***
password: ***
hikari:
maximum-pool-size: 60
idle-timeout: 60000
connection-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
minimum-idle: 10
config:
masterslave:
load-balance-algorithm-type: round_robin
name: dataSource
master-data-source-name: ds0
slave-data-source-names: ds1
props:
sql.show: true
druid数据源
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
application.yml
sharding:
jdbc:
datasource:
names: ds0,ds1
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: Guoyi1234!@#
name: master-datasource
initialSize: 20
maxActive: 60
maxWait: 60000
minEvictableIdleTimeMillis: 300000
timeBetweenEvictionRunsMillis: 60000
keepAlive: true
validationQuery: SELECT 1 FROM DUAL
minIdle: 20
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall,log4j
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: Guoyi1234!@#
# 配置监控中心显示的datasource名称
name: slave-datasource
# 启动程序时,在连接池中初始化多少个连接
initialSize: 20
# 连接池中最多支持多少个活动会话
maxActive: 60
# 程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池没有可用连接,单位毫秒,设置-1时表示无限等待
maxWait: 60000
# 池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将回收该连接,要小于防火墙超时设置
minEvictableIdleTimeMillis: 300000
# 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查
timeBetweenEvictionRunsMillis: 60000
# 程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超过minIdle指定的连接个数。
keepAlive: true
# 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果正常返回,则表示连接可用,否则表示连接不可用
validationQuery: SELECT 1 FROM DUAL
# 回收空闲连接时,将保证至少有minIdle个连接.
minIdle: 20
# 空闲时检测连接是否有效。(高效)
testWhileIdle: true
# 程序 申请 连接时,进行连接有效性检查(低效,影响性能)
testOnBorrow: false
# 程序 返还 连接时,进行连接有效性检查(低效,影响性能)
testOnReturn: false
# 缓存通过以下两个方法发起的SQL:public PreparedStatement prepareStatement(String sql);public PreparedStatement prepareStatement(String sql,int resultSetType, int resultSetConcurrency)
poolPreparedStatements: true
# 每个连接最多缓存多少个SQL
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监监控统计: filter:stat;日志监控: filter:log4j 或者 slf4j;防御SQL注入: filter:wall
filters: stat,wall,log4j
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
# 连接属性。比如设置一些连接池统计方面的配置。
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
config:
masterslave:
load-balance-algorithm-type: round_robin
name: dataSource
master-data-source-name: ds0
slave-data-source-names: ds1
props:
sql.show: true