为什么要实现读写分离?
面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,**将数据库拆分为主库和从库**。
主库负责处理事务性的增删改操作。
从库负责处理查询操作。
能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。
Sharding-JDBC
介绍
Sharding-JDBC
定位为轻量级Java框架,在Java的JDBC
层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC
和各种ORM
框架。
使用Sharding-JDBC
可以在程序中轻松的实现数据库读写分离。
- 适用于任何基于
JDBC
的ORM
框架,如:JPA
,Hibernate,Mybatis
,Spring JDBC Template
或直接使用JDBC
。 - 支持任何第三方的数据库连接池,如:
DBCP
,C3P0
,BoneCP
,Druid
,HikariCP
等。 - 支持任意实现
JDBC
规范的数据库。目前支持MySQL
,Oracle,SQLServer
,PostgreSQL
以及任何遵循SQL92
标准的数据库。
实现读写分离
首先需要将原来的数据库的数据导出为sql
文件。
然后配置数据库的主从复制,看我另一篇博客。
然后再将之前的sql
文件,导入到主库中,注意啊,是主库!!
步骤:
导入maven坐标
1
2
3
4
5<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>在配置文件中配置读写分离规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36spring:
#=============================读写分离配置=====================================
shardingsphere:
datasource:
names:
#数据源名字
master,slave #slave2...
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie?characterEncoding=utf-8
username: root
password: root
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.37.130:3306/reggie?characterEncoding=utf-8
username: root
password: root
#slave2:
# tyepe:...
# .....
masterslave:
# 读写分离配置
load-balance-algorithm-type: round_robin #负载均衡策略:轮询【从库可能有多个】
# 最终的数据源名称
name: dataSource
# 主库数据源名称
master-data-source-name: master #主数据源名字
# 从库数据源名称列表,多个逗号分隔
slave-data-source-names: slave #从数据源名字
props:
sql:
show: true #开启SQL显示,默认false在配置文件中允许bean定义覆盖配置项
当启动时,DruidDataSource
想创建一个数据源对象DataSource
。然后sharding-jdbc
也想创建一个数据源对象DataSource
,这样会产生冲突,可以配置允许bean定义覆盖配置项,这样后创建的会覆盖前面的。
1 | spring: |
其他代码啥也不用改。非常简单,不需要写额外的Java代码
当启动项目查询数据库时,发现WHERE (dish_id = ?) ORDER BY update_time DESC ::: DataSources: slave
,就表明配置成功。
__END__