最近项目中用到shardingJDBC来实现数据分表功能。自己也开始慢慢接触到shadingJDBC,花了一点时间来解析一下shardingJDBC整合到springboot中配置文件中的参数作用。
先附上官网连接:https://shardingsphere.apache.org/document/4.1.0/en/manual/sharding-jdbc/configuration/config-yaml/
接下来开始对参数一个一个解析:
spring:
shardingsphere:
dataSources: #数据源配置,可以配置多个
<data_source_name>: #<数据源池实现类> 具体的数据源
driverClassName: #数据库驱动名
url: #数据库连接
username: #数据库名
password: #数据库密码
shardingRule:
tables: #需要进行分表的逻辑表
<logic_table_name>: #逻辑表名
actualDataNodes: #描述数据源名称和实际表,分隔符为点,多个数据节点用逗号分隔,支持内联表达式。这意味着只对数据库进行分片。示例:ds${0..7}.tbl${1..0}
tableStrategy: #表分片策略,如果没有,则使用默认的数据库分片战略。下面的分片策略只能选择一种。
standard: #单分片列的标准分片场景
shardingColum: #用于分片的列名称
preciseAlgorithmClassName: #用于“=”和“IN”的精确算法类名。此类需要实现PreciseShardingAlgorithm,并且需要无参数构造函数
rangeAlgorithmClassName: #用于“between”之间的范围算法类名。此类需要实现RangeShardingAlgorithm,并且需要无参数构造函数
complex: #多个分片列的复杂分片场景
shardingColumns: #分片列的名称。用逗号分隔的多列
algorithmClassName: #复杂分片算法类名。此类需要实现ComplexKeysShardingAlgorithm,并且需要无参数构造函数
inline: #单分片列的内联表达式分片场景
shardingColum: #用于分片的列名称
algorithmInlineExpression: #切分算法的内联表达式
hint: #提示切分策略
algorithmClassName: #提示切分算法类名。这个类需要实现HintShardingAlgorithm,并且需要一个无参数构造函数
none: #不分片
databaseStrategy: #数据库分片策略,与表分片策略一样
keyGenerator:
column: #键生成器的列名
type: #键生成器的类型 SNOWFLAKE或UUID
props: #关于属性,请注意:当使用雪花时,`worker'。id'和'max.time.difference。需要设置“雪花”的毫秒数。要使用此算法的生成值作为分片值,建议配置“max.vibration.offset”`
bindingTables: #绑定表规则配置
props:
sql.show: #是否打印sql,默认为false
executor.size: #工作线程数,默认CPU线程数
check:
table:
metadata:
enabled: #若要检查所有表的元数据一致性,默认值:false
max:
connections:
size:
per:
query: #每个物理数据库的每个查询分配的最大连接数。默认值:1
官方也是对其中一个举了个例子。接下来分享两种分片策略的配置。
第一中:根据主键id奇偶进行分表
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1
m1:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/contraband_management?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: 用户命
password: 密码
sharding:
tables:
contraband:
actual-data-nodes: m1.contraband_t$->{1..2}
#主键策略
key-generateor:
cloum: id
type: SNOWFLAKE
#分片算法
table-strategy:
inline:
sharding-column: id
algorithm-expression: contraband_t$->{Long.valueOf(id)%2 + 1}
props:
sql:
show: true
第二种:自己定义分片算法
shardingsphere:
datasource:
names: ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/contraband_management?useUnicode=true&useSSL=false&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: 用户名
password: 密码
druid:
initial-size: 5
min-idle: 5
# 最大连接池数量
max-active: 20
# 获取连接等待超时的时间
max-wait: 60000
# 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
pool-prepared-statements: false
# PSCache的大小
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: #stat,wall
filter:
stat:
slow-sql-millis: 5000
merge-sql: true
connection-properties:
# 合并多个DruidDataSource的监控数据
use-global-data-source-stat: true
#由数据源名.表名组成。多个表以逗号分隔,支持inline表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点。
props:
sql:
show: false
sharding-rule:
tables:
t_door:
actual-data-nodes: ds0.t_door
## 指定分表规则
table-strategy:
standard:
sharding-column: time
precise-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.PreciseSharingTableAlgorithmOfAlarmhis
range-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.RangeShardingAlgorithmOfAlarm
t_alarm:
actual-data-nodes: ds0.t_alarm
## 指定分表规则
table-strategy:
standard:
sharding-column: time
precise-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.PreciseSharingTableAlgorithmOfAlarmhis
range-algorithm-class-name: com.jdb.contraband.config.shardingJDBC.RangeShardingAlgorithmOfAlarm
binding-tables:
- t_door, t_alarm
precise-algorithm-class-name和range-algorithm-class-name两个类及为自定义分片策略。需要实现什么样的接口,参照第一个代码块的解析。结合解析看学习的更快更明白。希望对大家有帮助。