ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;
支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;
支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。
ShardingSphere-JDBC 提供了 4 种配置方式,用于不同的使用场景。 通过配置,应用开发者可以灵活的使用数据分片、读写分离、数据加密、影子库等功能,并且能够叠加使用。
官网地址
本文使用的工具如下:
org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
4.1.1
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
8.0.11
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
//省略get set方法
}
//操作User对象的仓库
public interface UserRepository extends JpaRepository<User,Integer> {
}
测试代码
@SpringBootTest
class ShardingsphereApplicationTests {
@Autowired
private UserRepository userRepository;
@Test
void contextLoads() {
for (int i = 0; i < 100; i++) {
User user = new User();
user.setAge(i);
user.setName("张三" + i);
userRepository.save(user);
}
List<User> userList=userRepository.findAll();
System.out.println("用户的数量="+userList.size());
}
}
需配置mysql的主从同步
请参考我写过的博客配置: 点我跳转
读写分离用到的配置
server:
port: 8030
spring:
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
shardingsphere:
datasource:
# 数据源名称集合
names: master,slave1
#主库
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.239.128:3306/test?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoR
username: root
password: 123456
pool-name: MyHikariCP_1
minimum-idle: 10
maximum-pool-size: 30
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
#从库
slave1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.239.128:3307/test?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoR
username: root
password: 123456
pool-name: MyHikariCP_2
minimum-idle: 10
maximum-pool-size: 30
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
sharding:
master-slave-rules:
master-slave-group:
# 指定主节点名字 写操作
master-datasource-name: master
# 指定从节点名字,多个读节点用逗号分开 读操作
slave-data-source-names: slave1
masterslave:
# 配置从库选择策略,提供轮询与随机,这里选择用轮询
load-balance-algorithm-type: round_robin
#打印sharding的日志
props:
sql:
show: true
运行标题3的测试类结果入下
可以看到写的操作用的是master数据源,读的操作用的slave1数据源。
server:
port: 8030
database:
#数据库连接地址
ip: 127.0.0.1
#数据库端口
port: 3306
username: root
password: 123456
#连接信息前缀
url-prefix: jdbc:mysql://${database.ip}:${database.port}
url-suffix: createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoReconnect=true
#配置数据库名称集合
datasource:
db1: test1
db2: test2
spring:
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
shardingsphere:
datasource:
# 数据源名称集合
names: ${database.datasource.db1}, ${database.datasource.db2}
test1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: ${database.url-prefix}/${database.datasource.db1}?${database.url-suffix}
username: ${database.username}
password: ${database.password}
pool-name: MyHikariCP_1
minimum-idle: 10
maximum-pool-size: 30
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
test2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: ${database.url-prefix}/${database.datasource.db2}?${database.url-suffix}
username: ${database.username}
password: ${database.password}
pool-name: MyHikariCP_2
minimum-idle: 10
maximum-pool-size: 30
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
sharding:
# 默认分库 未配置分片规则的表将通过默认数据源定位
default-data-source-name: ${database.datasource.db1}
# 分表
tables:
#表名
user:
#数据库名称$->{数量范围}.表名称$->{数量范围}
actual-data-nodes: test$->{1..2}.user$->{1..2}
#分库策略
database-strategy:
# 行表达式模式
inline:
# 配置库分片的字段
sharding-column: age
# 表达式,分库的算法,这个是通过年龄取模然后决定落到哪个库
algorithm-expression: test$->{age % 2 + 1}
# 配置表分片策略
table-strategy:
# 行表达式
inline:
# 配置表分片的字段
sharding-column: id
# 配置表分片算法
algorithm-expression: user$->{id % 2 +1}
key-generator:
column: id
# 雪花算法生成id
type: SNOWFLAKE
#打印sharding的日志
props:
sql:
show: true
根据id取模分库
server:
port: 8030
database:
#数据库连接地址
ip: 127.0.0.1
#数据库端口
port: 3306
username: root
password: 123456
#连接信息前缀
url-prefix: jdbc:mysql://${database.ip}:${database.port}
#连接信息后缀
url-suffix: createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoReconnect=true
#配置数据库名称集合
datasource:
db1: test1
db2: test2
spring:
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
shardingsphere:
datasource:
# 数据源名称集合
names: ${database.datasource.db1}, ${database.datasource.db2}
test1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: ${database.url-prefix}/${database.datasource.db1}?${database.url-suffix}
username: ${database.username}
password: ${database.password}
test2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: ${database.url-prefix}/${database.datasource.db2}?${database.url-suffix}
username: ${database.username}
password: ${database.password}
sharding:
# 默认分库 未配置分片规则的表将通过默认数据源定位
default-data-source-name: ${database.datasource.db1}
# 分表
tables:
#表名
user:
#数据库名称$->{数量范围}.表名称
actual-data-nodes: test$->{1..2}.user
#分库策略
database-strategy:
# 行表达式模式
inline:
#配置库分片的字段
sharding-column: id
# 表达式,分库的算法,这个是通过id取模然后决定落到哪个库
algorithm-expression: test$->{id% 2 + 1}
key-generator:
column: id
# 雪花算法生成id
type: SNOWFLAKE
#打印sharding的日志
props:
sql:
show: true
根据id取模分表
server:
port: 8030
database:
#数据库连接地址
ip: 127.0.0.1
#数据库端口
port: 3306
username: root
password: 123456
#连接信息前缀
url-prefix: jdbc:mysql://${database.ip}:${database.port}
url-suffix: createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoReconnect=true
#配置数据库名称集合
datasource:
db0: test
spring:
jpa:
hibernate:
# 自动建表 最好改成 none
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
shardingsphere:
datasource:
# 数据源名称集合
names: ${database.datasource.db0}
test:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: ${database.url-prefix}/${database.datasource.db0}?${database.url-suffix}
username: ${database.username}
password: ${database.password}
pool-name: MyHikariCP
minimum-idle: 10
maximum-pool-size: 30
idle-timeout: 600000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
sharding:
# 默认分库 未配置分片规则的表将通过默认数据源定位
default-data-source-name: ${database.datasource.db0}
# 分表
tables:
#表名
user:
#数据库名称.表名称$->{数量范围}
actual-data-nodes: test.user$->{1..2}
# 配置表分片策略
table-strategy:
# 行表达式
inline:
# 配置表分片的字段
sharding-column: id
# 配置表分片算法
algorithm-expression: user$->{id % 2 +1}
key-generator:
column: id
# 雪花算法生成id
type: SNOWFLAKE
#打印sharding的日志
props:
sql:
show: true
gitee代码地址
创作不易,要是觉得我写的对你有点帮助的话,麻烦在gitee上帮我点下 Star
【SpringBoot框架篇】其它文章如下,后续会继续更新。