shardingjdbc使用与入门与springBoot的简单整合
首先我知道背地里说上司的的不是很不好,影响很差,可能会影响到我将来的出路,甚至以后换工作如果被人挖出了这个博客甚至都有可能不要我了,但是我是真的忍不住了
我! 日! 你! 妈! 耶!
好了,骂完了,对不起!!!
公司有一张表数据量特大,说是有月入上亿的数据量,上司规划不好 当初做的时候没有考虑那么多,想一出是一出,先在查询速度贼慢,上司说要做分片,然后他不会,把任务交给了我这个去面试别人都说我连一年经验都算不上的人.好了我就开始鼓捣sharding-jdbc,之前真的没用过这玩意儿,只知道他是一个轻量级的在代码层的数据分片技术,开始鼓捣,官方文档,百度,专业前辈
最后终于整到项目里了:
- yaml,配置文件
sharding:
jdbc:
datasource:
names: ds0,ds1,ds2 #配置的数据源名字
ds0:
type: com.alibaba.druid.pool.DruidDataSource #连接池
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/order1
username: root
password: root
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/order2
username: root
password: root
ds2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://********:3306/*****?characterEncoding=utf8&useSSL=false
username: *****
password: ******
config:
sharding:
props:
sql.show: true
tables:
t_user: #表的逻辑名称
key-generator-column-name: id #主键
actual-data-nodes: ds${0..1}.t_user${0..1} #数据节点 这里的t_user0\t_user1 这是真实名称
database-strategy: #分库策略
inline:
sharding-column: city_id
algorithm-expression: ds${city_id % 2} #按在city_id字段带分表奇数是1数据源,偶数是0数据源
table-strategy: #分表策略
inline:
shardingColumn: sex
algorithm-expression: t_user${sex % 2} #按在sex字段带分表奇数是1表,偶数是0表
t_address:
key-generator-column-name: id
actual-data-nodes: ds${0..1}.t_address
database-strategy:
inline:
shardingColumn: lit
algorithm-expression: ds${lit % 2}
demo_now:
key-generator-column-name: id #主键
actual-data-nodes: ds${0..1}.demo_now #数据节点
database-strategy: #分库策略
inline:
sharding-column: id
algorithm-expression: ds${id % 2}
defaultDataSourceName: ds2 #设置默认的数据源,如果没有找到对应的逻辑表的话,就会去这个数据源里面查 这里配置这没分表的数据库
- pom
<!--还有很多的版本与其他的坐标
像当当的包
我直接说 我不会
-->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>3.0.0</version>
</dependency>
<!--德鲁伊连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
- 然后把我分片的表的多表查询改成单表就就ok了
千万注意有分表,有未分表不能使用多表连接查询!!!
会报找不到当前表的异常的
“Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘order1.tabel1’ doesn’t exist”
因为 sharding-jdbc是把多个数据数据源模拟一个数据源,然后按照对应的规则生成sql然后向对应的数据源插入数据
一旦你多表查询他就以为你的两个表都在一个数据库,就gg了
然后如果你的项目之前就只是单数据源的项目的话 这样就OK了 springboot会自动兼容你的配置的,管他是mybatis啊,jpa啊,JDBCtemplate啊,他全都兼容的,因为sharding-jdbc就是在数据源上动的手脚,我管你什么持久层框架总要用到数据源的吧,当是好像还有很多更加复杂的配置 和使用情况 java硬编码的方式配置,多数据源的情况下配置啊 我都不会了,有会的大佬可以教我一下丢个链接什么的 感谢感谢
下面附上官网的连接:
中文的哟
附加: algorithm-expression: table_1${base_id.toLong() % 3} 字符串转long
${}括号里可以加Groovy表达式