目录

一. 在Docker中安装ShardingSphere

二 实践:读写分离

2.1 应用场景

2.2 架构图

2.3 服务器规划

2.4 启动数据库服务器

2.5. 配置读写分离

2.6 日志配置

2.7 重启ShardingSphere

2.8 测试

2.9. 负载均衡

2.9.1. 随机负载均衡算法示例

2.9.2. 轮询负载均衡算法示例

2.9.3. 权重负载均衡算法示例

2.10 手动事务


一. 在Docker中安装ShardingSphere

 接下来我将讲解ShardingSphere在Docker里面的安装

创建Docker容器所需的映射目录

我们必须提前进行创建

mkdir -p /bit/shardingsphere/proxy/conf
mkdir -p /bit/shardingsphere/proxy/ext-lib
mkdir -p /bit/shardingsphere/proxy/logs

 

创建Docker容器

这个 docker run 命令是用来安装并启动一个 ShardingSphere-Proxy 容器的。ShardingSphere-Proxy 是一个透明的数据库代理,它允许你像连接普通 MySQL 服务器一样连接它,但它背后可以管理多个数据库实例,实现分库分表、读写分离等高级功能。 

docker run -d \-p 3307:3307 \-v /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf \-v /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \-v /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs \-e JVM_OPTS="-Xms256m -Xmx256m -Xmn128m" \--name ss-proxy \apache/shardingsphere-proxy:5.3.2

这些参数啥意思呢? 我们看看

docker run -d \
  • docker run:Docker 命令,用于创建并启动一个新的容器。
  • -d:表示以后台(detached)模式运行容器。容器启动后,命令行会立即返回,不会阻塞。
-p 3307:3307 \
  • -p:用于映射端口。
  • 3307:3307:将宿主机(Host)的 3307 端口映射到容器(Container)内部的 3307 端口。这意味着,外部应用程序(如你的应用代码、MySQL 客户端工具)需要连接宿主机的 3307 端口来访问 ShardingSphere-Proxy 服务。
-v /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf \
  • -v:用于创建数据卷(Volume),实现宿主机目录与容器目录的绑定(挂载)。
  • /bit/shardingsphere/proxy/conf:/opt/shardingsphere-proxy/conf:将宿主机上的 /bit/shardingsphere/proxy/conf 目录挂载到容器内的 /opt/shardingsphere-proxy/conf 目录。这个目录通常存放 ShardingSphere-Proxy 的核心配置文件,如 server.yaml(服务配置)和 config-xxx.yaml(数据分片/读写分离规则配置)。通过挂载,你可以在宿主机上直接修改配置文件,而无需进入容器内部,修改后重启容器即可生效。
-v /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib \
  • /bit/shardingsphere/proxy/ext-lib:/opt/shardingsphere-proxy/ext-lib:将宿主机上的 /bit/shardingsphere/proxy/ext-lib 目录挂载到容器内的 /opt/shardingsphere-proxy/ext-lib 目录。这个目录用于存放用户自定义的 JAR 包,例如:
    • 数据库驱动(如果官方镜像里没有你需要的数据库驱动,如 Oracle)。
    • 自定义的分片算法类。
    • 自定义的加密算法类。
    • 自定义的分布式序列生成器。
-v /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs \
  • /bit/shardingsphere/proxy/logs:/opt/shardingsphere-proxy/logs:将宿主机上的 /bit/shardingsphere/proxy/logs 目录挂载到容器内的 /opt/shardingsphere-proxy/logs 目录。ShardingSphere-Proxy 的运行日志(如 shardingsphere.log)会输出到这个目录。挂载后,你可以在宿主机上方便地查看和管理日志文件,即使容器被删除,日志也保留在宿主机上。
-e JVM_OPTS="-Xms256m -Xmx256m -Xmn128m" \
  • -e:用于设置环境变量(Environment Variable)。
  • JVM_OPTS="-Xms256m -Xmx256m -Xmn128m":将环境变量 JVM_OPTS 的值设置为指定的 JVM 内存参数。当 ShardingSphere-Proxy 启动时,会读取这个环境变量,并将其作为 JVM 的启动参数,从而控制其内存使用。
--name ss-proxy \
  • --name:为启动的容器指定一个名称。
  • ss-proxy:这个容器的名称被设置为 ss-proxy。之后你可以使用 docker stop ss-proxydocker start ss-proxydocker logs ss-proxy 等命令来管理这个容器,比使用容器的 ID 更方便。
apache/shardingsphere-proxy:5.3.2
  • apache/shardingsphere-proxy:5.3.2:这是要运行的 Docker 镜像的名称和标签。
    • apache/shardingsphere-proxy 是镜像的名称。
    • 5.3.2 是镜像的版本标签(Tag)。Docker 会首先检查本地是否有这个镜像,如果没有,会自动从 Docker Hub(或其他配置的镜像仓库)拉取这个版本的镜像,然后使用它来创建并启动容器。

废话不多说,我们直接执行就OK。

然后我们来看看有没有启动成功啊 

# 查看是否启动成功
docker ps -a

 我们发现没有启动成功,这个是因为docker容器没有进行配置

修改配置文件

首先我们需要来到这个配置文件对应的 宿主机映射目录里面,也就是/bit/shardingsphere/proxy/conf

cd  /bit/shardingsphere/proxy/conf

我们就在这个目录里面创建一个配置文件server.yaml

vim server.yaml

然后把下面这个粘贴进去即可 

# 运行模式配置
mode:type: Standalone  # 单机模式(非集群部署)# 用户权限配置
authority:users:- user: root@%          # 用户名格式:用户名@访问主机(%表示允许任意主机访问)password: 123456      # 用户密码privilege:type: ALL_PERMITTED     # 权限类型:授予该用户所有操作权限# 系统属性配置
props:sql-show: true  # 是否在日志中显示执行的SQL语句(true=显示,false=隐藏)proxy-mysql-default-version: 8.0.42  # 代理对外暴露的MySQL默认版本号

 

我们保存退出。

上传MySQL驱动

连接MySQL数据库时,需要把MySQL驱动包放入宿主机映射扩展目录/bit/shardingsphere/proxy/ext-lib中

cd /bit/shardingsphere/proxy/ext-lib

现在我们可以上一小节下载的 MySQL驱动驱动直接复制到这里即可。

当然,大家执行下面这个命令也是可以的

wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar

启动

启动Docker容器,运行ShardingSphere

# 重新启动容器
docker start ss-proxy
# 查看状态,启动成功
docker ps

 

没有一点问题

测试连接

通过客户端工具连接

# 指定主机和端口号进行连接,成功
mysql -uroot -p -h127.0.0.1 -P3307

进入Docker容器

# 进入容器
docker exec -it ss-proxy env LANG=C.UTF-8 /bin/bash

 如果我们想要远程登陆这个服务器的话,需要去云服务器里面的防火墙和安全组里面开放这个3307端口。

二 实践:读写分离

2.1 应用场景

        当系统负载越来越大时,I/O作为整个系统的性能瓶颈就越来越明显,大量的数据库访问可能会把某个数据节点打爆(尤其是在单台数据库服务器的情况下),通过部署读写分离可以有效的解决单点故障问题并提升系统性能。

有以下需求时可以使用读写分离架构部署数据库服务:

  1. 读多写少的场景:很多的应用程序都是读多写少的场景,读写分离可以将读请求分散到多个从服务器上,从而减轻主服务器的负担,显著提高读操作的性能。
  2. 水平扩展:通过增加从服务器的数量,可以进一步扩展数据库的读能力,以应对不断增长的负载。
  3. 故障转移:在主服务器发生故障时,可以快速将读和写操作切换到从服务器,保证服务的可用性。
  4. 实时备份:从服务器也可以作为主服务器的实时备份节点,当主服务器发生故障时,可以快速恢复数据。

2.2 架构图

采用一主两从的数据库集群架构

2.3 服务器规划

在单台服务器上使用 Docker 模拟多台服务器的场景  

主从服务器IP一致,端口号不同  

  • 主服务器:容器名 bit-mysql-master 端口号 53306
  • 从服务器1:容器名 bit-mysql-slavel,端口号 53307
  • 从服务器2:容器名 bit-mysql-slave2,端口号 53308

我们已经在先前的文章里面实现了两个从节点对主节点的数据的实时复制,也就是所谓的主从复制,但是我们还没有实现读写分离,那么我们今天的读写分离主要是针对中间件——ShardingSphere-Proxy,我们通过配置ShardingSphere-Proxy即可在原来主从复制的基础之上完成读写分离。

注意:启动docker前先关闭防火墙

sudo systemctl status ufw

2.4 启动数据库服务器

注意:这里的主从复制配置我们已经完成,我们这里只检验一下主从复制机制是否正常运行而已,主从复制具体配置步骤请看:【 MySQL集群架构与实践2】高性能架构模式,ShardingSphere的安装-CSDN博客

首先启动主从节点的数据库服务器,保证主从节点正常工作.

具体怎么做呢?

先看看这些节点有没有在运行

docker ps

 很好,都在运行,那么我们直接使用mysql去进行登陆即可

#登陆主节点
mysql -h127.0.0.1 -P53306 -uroot -p#登陆从节点1
mysql -h127.0.0.1 -P53307 -uroot -p#登陆从节点2
mysql -h127.0.0.1 -P53308 -uroot -p

 

 

这个时候我们需要检测一下主从复制机制还有没有在生效?

首先我们需要查看两个从节点的信息

 

我们在主节点执行一下DML语句

我们接着回去两个从节点看看有没有在进行同步复制

答案很明显了啊!!!我们的主从复制是没有问题的啊,下面我们就来进行配置读写分离

2.5. 配置读写分离

首先我们需要来到这个配置文件对应的 宿主机映射目录里面,也就是/bit/shardingsphere/proxy/conf

cd /bit/shardingsphere/proxy/conf

接下来我们将创建一个文件 config-readwrite-splitting.yaml

vim config-readwrite-splitting.yaml

 config-readwrite-splitting.yaml 在 ShardingSphere Proxy 中的作用是:定义读写分离规则,将数据库操作智能路由到主库(写操作)和从库(读操作),实现数据库负载均衡和高可用。 

那这里面具体要填放什么东西呢? 

我们去看看我们使用二进制发布包安装的 ShardingSphere Proxy里面的conf目录看看,那里也有一个config-readwrite-splitting.yaml,这个文件是系统提供给我们的模板,这个文件默认里面全是注释,我们只需要在它的基础之上进行修改即可。

在config-readwrite-splitting.yaml里面官方其实已经就帮我们写了一些模板,只不过默认是被注释掉了,我们只需要进去修改database-readwrite-splitting.yaml 配置文件即可

大家找到上面这个啊,那就是我们的模板啊。我们只需在这个模板上面做些修改即可。 

databaseName: bit_proxy_dbdataSources:write_ds:url: jdbc:mysql://150.158.139.86:53306/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_0:url: jdbc:mysql://150.158.139.86:53307/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_1:url: jdbc:mysql://150.158.139.86:53308/bit_db?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000rules:
- !READWRITE_SPLITTINGdataSources:readwrite_ds:staticStrategy:writeDataSourceName: write_dsreadDataSourceNames:- read_ds_0- read_ds_1# loadBalancerName: weight    # 负载均衡策略名 以下分别是:权重,轮询,随机# loadBalancerName: round_robinloadBalancerName: randomloadBalancers:random:type: RANDOMround_robin:type: ROUND_ROBINweight:type: WEIGHTprops:read_ds_0: 2.0read_ds_1: 1.0

注意:这里特别容易出问题,所以我推荐大家去官网使用官方的配置:shardingsphere/examples/shardingsphere-proxy-example/shardingsphere-proxy-boot-mybatis-example/src/main/resources/conf/config-readwrite-splitting.yaml at 5.3.2 · apache/shardingsphere · GitHub 

url中最重要的是IP地址,端口号,数据库名 

 我们保存退出。

我们这里就是配置数据源的问题,让ShardingSphere知道哪个是主节点,哪个是从节点。

2.6 日志配置

首先我们需要来到这个配置文件对应的 宿主机映射目录里面,也就是/bit/shardingsphere/proxy/conf

cd /bit/shardingsphere/proxy/conf

接下来我们将创建一个文件

vim logback.xml

并编写以下内容

<?xml version="1.0"?>
<configuration><!-- 日志输入到文件 --><appender name="SHARDING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志路径 --><file>./logs/shardingsphere.log</file><encoder><!-- 日志输入的样式 --><pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>shardingsphere.%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy></appender><root level="INFO"><appender-ref ref="SHARDING_FILE" /></root></configuration>

 

我们保存退出一下 。

2.7 重启ShardingSphere

# 重新启动ShardingSphere的Docker容器
docker restart ss-proxy# 查看容器是否启动成功
docker ps

# 使用客户端连接ShardingSphere
mysql -h150.158.139.86 -P3307 -uroot -p


我们可以进去看看

我们看看里面的内容

2.8 测试

我们可以去宿主机映射的目录/bit/shardingsphere/proxy/logs打开实时日志

# 进入容器
cd /bit/shardingsphere/proxy/logs# 查看ShardingSphere的实时日志
tail -f shardingsphere.log

 

删除数据 

日志里面就多了下面

[INFO ] 2025-07-31 02:54:23.319 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: delete from t_user where id=4

[INFO ] 2025-07-31 02:54:23.321 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: delete from t_user where id=4

这就说明删除操作是在主节点进行操作的

写入数据

执行INSERT语句写入一条数据

-- 客户端执行INSERT语句,写入一和数据
insert into t_user (name) values ('test');

日志中显示如下信息:

[INFO ] 2025-07-31 02:56:17.640 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Logic SQL: insert into t_user (name) values ('test')

[INFO ] 2025-07-31 02:56:17.640 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user (name) values ('test')

补充一下:

  1. Logic SQL是客户端发来的语句
  2. Actual SQL是ShardingSphere根据配置的规则发送到某一个具体的节点上执行的语句

这就说明insert是在主节点进行操作的

查询数据

多次执行SELECT语句进行查询

-- 执行两次
select * from t_user;select * from t_user;

在日志中显示如下信息:

# 第一次查询

[INFO ] 2025-07-31 02:59:23.958 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 02:59:23.958 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

# 第二次查询

[INFO ] 2025-07-31 02:59:26.853 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 02:59:26.854 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user

这就说明select是在两个从节点进行操作的

现在就说明,我们的读写分离已经完成了。

2.9. 负载均衡

ShardingSphere 内置提供了多种负载均衡算法,具体包括轮询算法、随机访问算法和权重访问算法,能够满足用户绝大多数业务场景的需要.

轮询负载均衡算法类型:ROUND_ROBIN

根据请求次数和服务器数量进行负载均衡。

随机负载均衡算法类型:RANDOM

请求具体发送到哪个真实的服务器不确定,完全随机,负载不易控制。

这个其实是不会使用的。 

权重负载均衡算法类型:WEIGHT

不同的服务器配置不同的权重,权重大的负载高,可以根据服务器的硬件指定合适的权重。

权重负载均衡算法可配置属性:

属性名称

数据类型

说明

${replica-name}

double

属性名使用读库名称,参数填写读库对应的权重值。权重≥0,合计≤Double.MAX_VALUE

config-readwrite-splitting.yaml的部分配置示例:

rules:
- !READWRITE_SPLITTING  # 声明读写分离规则dataSources:readwrite_ds:  # 读写分离数据源名称staticStrategy:  # 静态策略(非动态发现)writeDataSourceName: write_ds  # 写操作专用数据源readDataSourceNames:           # 读操作数据源列表- read_ds_0  # 读库实例1- read_ds_1  # 读库实例2loadBalancerName: weight  # 指定读库使用的负载均衡器(指向下方定义的weight配置)# ==================== 负载均衡器配置 ====================loadBalancers:# 可选算法1:随机选择random:type: RANDOM  # 随机算法,每次从读库中随机选择一个# 可选算法2:轮询选择round_robin: type: ROUND_ROBIN  # 轮询算法,按顺序依次选择读库# 实际使用的算法:加权负载均衡weight:type: WEIGHT  # 加权算法,根据权重分配读请求props:        # 权重配置(必须与readDataSourceNames中的名称匹配)read_ds_0: 2.0  # 读库1的权重值(数值越大被选中的概率越高)read_ds_1: 1.0  # 读库2的权重值# 权重计算逻辑:#   read_ds_0概率 = 2.0/(2.0+1.0) ≈ 66.7%#   read_ds_1概率 = 1.0/(2.0+1.0) ≈ 33.3%

上面这个例子里现在就是使用了加权负载均衡算法。(因为loadBalancerName: weight)

在上面这个例子里如果说loadBalancerName: random,则是使用随机负载均衡算法

上面这个例子里loadBalancerName:round_robin,则是使用轮询负载均衡算法


2.9.1. 随机负载均衡算法示例

我们回到上面我们配置的 /bit/shardingsphere/proxy/conf/config-readwrite-splitting.yaml文件里面看看

      loadBalancerName: randomloadBalancers:random:type: RANDOMround_robin:type: ROUND_ROBINweight:type: WEIGHTprops:read_ds_0: 2.0read_ds_1: 1.0

我们之前使用的是随机负载均衡算法啊!!

2.9.2. 轮询负载均衡算法示例

我们还是来到配置文件的目录下面

我们进去config-readwrite-splitting.yaml,修改成轮询负载均衡算法 

接下来我们重启一下我们的容器

docker restart ss-proxy
docker ps

接下来我们还是去看看日志

tail -f /bit/shardingsphere/proxy/logs

接着我们换一个终端来登录我们的mysql服务器

mysql -h127.0.0.1 -P3307 -uroot -p

接着我们看看

写入 

insert into t_user(name) values ('test05');

 日志里多了这两句

[INFO ] 2025-07-31 03:55:27.393 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Logic SQL: insert into t_user(name) values ('test05')

[INFO ] 2025-07-31 03:55:27.393 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user(name) values ('test05')

写入都在读节点。

查询

select * from t_user;

第一次查询

[INFO ] 2025-07-31 04:03:52.520 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user

[INFO ] 2025-07-31 04:03:52.520 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user

第二次查询

[INFO ] 2025-07-31 04:05:05.362 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:05.362 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第三次查询

[INFO ] 2025-07-31 04:05:39.234 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:39.234 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user

第四次查询

[INFO ] 2025-07-31 04:05:41.564 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 04:05:41.564 [ShardingSphere-Command-3] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

很标准的轮询啊

2.9.3. 权重负载均衡算法示例

我们还是来到配置文件的目录下面

 我们进去config-readwrite-splitting.yaml,修改成权重负载均衡算法示例

接下来我们重启一下我们的容器

docker restart ss-proxy
docker ps

接下来我们还是去看看日志

tail -f /bit/shardingsphere/proxy/logs

接着我们换一个终端来登录我们的mysql服务器

mysql -h127.0.0.1 -P3307 -uroot -p

接着我们看看

写入 

insert into t_user(name) values ('test06');

 日志里多了这两句

[INFO ] 2025-07-31 07:25:23.859 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: insert into t_user(name) values ('test06')

[INFO ] 2025-07-31 07:25:23.860 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user(name) values ('test06')

写入都在读节点。

查询

select * from t_user;

第一次查询

[INFO ] 2025-07-31 07:25:51.789 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:51.789 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第二次查询

[INFO ] 2025-07-31 07:25:54.740 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:54.741 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第三次查询

[INFO ] 2025-07-31 07:25:55.594 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:55.595 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第四次查询

[INFO ] 2025-07-31 07:25:56.125 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:56.125 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第五次查询

[INFO ] 2025-07-31 07:25:57.048 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:57.048 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

第六次查询

[INFO ] 2025-07-31 07:25:57.566 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:57.567 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user

第七次查询

[INFO ] 2025-07-31 07:25:59.127 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:25:59.130 [ShardingSphere-Command-1] INFO  ShardingSphere-SQL - Actual SQL: read_ds_0 ::: select * from t_user

我们看到大部分情况都是从节点1在执行这个查询业务,只有少部分情况才会是从节点2在执行

2.10 手动事务

-- 开始事务
start transaction;-- 插入一条数据
insert into t_user (name) values ('transaction');-- 查询
select * from t_user;-- 回滚,结束事务
rollback;-- 再次查询
select * from t_user;

日志中显示如下信息:

#写入操作

[INFO ] 2025-07-31 07:30:20.112 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Logic SQL: insert into t_user (name) values ('transaction')
[INFO ] 2025-07-31 07:30:20.112 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: insert into t_user (name) values ('transaction')

#事务中查询

[INFO ] 2025-07-31 07:30:27.936 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:30:27.937 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Actual SQL: write_ds ::: select * from t_user

#事务后查询

[INFO ] 2025-07-31 07:30:40.634 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Logic SQL: select * from t_user
[INFO ] 2025-07-31 07:30:40.634 [ShardingSphere-Command-2] INFO  ShardingSphere-SQL - Actual SQL: read_ds_1 ::: select * from t_user
 

我们发现事务中的查询可是在写服务器里执行的。 

注意:如果开启事务,则所有的操作都会被路由到写服务器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91284.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91284.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91284.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven的阿里云镜像地址

在 Maven 中配置阿里云镜像可以加速依赖包的下载&#xff0c;尤其是国内环境下效果明显。以下是阿里云 Maven 镜像的配置方式&#xff1a; 配置步骤&#xff1a;找到 Maven 的配置文件 settings.xml 全局配置&#xff1a;位于 Maven 安装目录的 conf/settings.xml用户级配置&am…

大语言模型信息抽取系统解析

这段代码实现了一个基于大语言模型的信息抽取系统&#xff0c;能够从金融和新闻类文本中提取结构化信息。下面我将详细解析整个代码的结构和功能。1. 代码整体结构代码主要分为以下几个部分&#xff1a;模式定义&#xff1a;定义不同领域(金融、新闻)需要抽取的实体类型示例数据…

Next实习项目总结串联讲解(一)

下面是一些 Next.js 前端面试中常见且具深度的问题&#xff0c;按照逻辑模块整理&#xff0c;同时提供示范回答建议&#xff0c;便于你条理清晰地展示理解与实践经验。 ✅ 面试讲述结构建议 先讲 Next.js 是什么&#xff0c;它为什么比 React 更高级。(支持 SSR/SSG/ISR,提升S…

React开发依赖分析

1. React小案例&#xff1a; 在界面显示一个文本&#xff1a;Hello World点击按钮后&#xff0c;文本改为为&#xff1a;Hello React 2. React开发依赖 2.1. 开发React必须依赖三个库&#xff1a; 2.1.1. react: 包含react所必须的核心代码2.1.2. react-dom: react渲染在不同平…

工具(一)Cursor

目录 一、介绍 二、如何打开文件 1、从idea跳转文件 2、单独打开项目 三、常见使用 1、Chat 窗口 Ask 对话模式 1.1、使用技巧 1.2 发送和使用 codebase 发送区别 1.3、问题快速修复 2、Chat 窗口 Agent 对话模式 2.1、agent模式功能 2.2、Chat 窗口回滚&撤销 2.3…

Prompt编写规范指引

1、&#x1f4d6; 引言 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的快速发展&#xff0c;越来越多的开发者开始利用AIGC工具来辅助代码编写。然而&#xff0c;如何编写有效的提示词&#xff08;Prompt&#xff09;以引导AIGC生成高质量的代码&#xff0c;成为了许…

自我学习----绘制Mark点

在PCB的Layout过程中我们需在光板上放置Mark点以方便生产时的光学定位&#xff08;三点定位&#xff09;&#xff1b;我个人Mark点绘制步骤如下&#xff1a; layer层&#xff1a;1.放置直径1mm的焊盘&#xff08;无网络连接&#xff09; 2.放置一个圆直径2mm&#xff0c;圆心与…

2025年财税行业拓客破局:小蓝本财税版AI拓客系统助力高效拓客

2025年&#xff0c;在"金税四期"全面实施的背景下&#xff0c;中国财税服务市场迎来爆发式增长&#xff0c;根据最新的市场研究报告&#xff0c;2025年中国财税服务行业产值将达2725.7亿元。然而&#xff0c;行业高速发展的背后&#xff0c;80%的财税公司却陷入获客成…

双向链表,对其实现头插入,尾插入以及遍历倒序输出

1.创建一个节点&#xff0c;并将链表的首节点返回创建一个独立节点&#xff0c;没有和原链表产生任何关系#include "head.h"typedef struct Node { int num; struct Node*pNext; struct Node*pPer; }NODE;后续代码&#xff1a;NODE*createNode(int value) {NODE*new …

2025年自动化工程与计算机网络国际会议(ICAECN 2025)

2025年自动化工程与计算机网络国际会议&#xff08;ICAECN 2025&#xff09; 2025 International Conference on Automation Engineering and Computer Networks一、大会信息会议简称&#xff1a;ICAECN 2025 大会地点&#xff1a;中国柳州 审稿通知&#xff1a;投稿后2-3日内通…

12.Origin2021如何绘制误差带图?

12.Origin2021如何绘制误差带图?选中Y3列→点击统计→选择描述统计→选择行统计→选择打开对话框输入范围选择B列到D列点击输出量→勾选均值和标准差Control选择下面三列点击绘图→选择基础2D图→选择误差带图双击图像→选择符号和颜色点击第二个Sheet1→点击误差棒→连接选择…

如何使用API接口获取淘宝店铺订单信息

要获取淘宝店铺的订单信息&#xff0c;您需要通过淘宝开放平台(Taobao Open Platform, TOP)提供的API接口来实现。以下是详细步骤&#xff1a;1. 注册淘宝开放平台账号访问淘宝开放平台注册开发者账号并完成实名认证创建应用获取App Key和App Secret2. 申请API权限在"我的…

【Kiro Code 从入门到精通】重要的功能

一、Kiro 是什么&#xff1f; Kiro 是一款智能型集成开发环境&#xff08;IDE&#xff09;&#xff0c;借助规格说明&#xff08;specs&#xff09;、向导&#xff08;steer&#xff09;、钩子&#xff08;hooks&#xff09;帮助你高效完成工作。 二、Specs 规格说明 规范&…

直播间里的酒旅新故事:内容正在重构消费链路

文/李乐编辑/子夜今年暑期&#xff0c;旅游的热浪席卷全国。机场、火车站人潮涌动&#xff0c;电子屏上滚动的航班信息与检票口前的长队交织成繁忙的出行图景&#xff0c;酒店预订量也在这股热潮中节节攀升。连线 Insight关注到&#xff0c;今年的暑期游有了一些新变化&#xf…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | VerifyAccountUi(验证码组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— VerifyAccountUi组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 语法结合 Tailwind CS…

AbstractAuthenticationToken 认证流程中​​认证令牌的核心抽象类详解

AbstractAuthenticationToken 认证流程中​​认证令牌的核心抽象类详解在 Spring Security 中&#xff0c;AbstractAuthenticationToken 是 Authentication 接口的​​抽象实现类​​&#xff0c;其核心作用是为具体的认证令牌&#xff08;如用户名密码令牌、JWT 令牌等&#x…

小程序视频播放,与父视图一致等样式设置

初始设置的代码&#xff1a;WXML的代码<view class"card-wrapper"> <!-- 视频播放容器&#xff08;默认隐藏&#xff09; --> <view class"video-container" wx:if"{{isPlaying}}"> <video id"cardVideo" class&…

Kafka——关于主题管理

引言在Kafka的世界中&#xff0c;主题&#xff08;Topic&#xff09;是消息的基本组织单位&#xff0c;类似于文件系统中的"文件夹"——所有消息都按照主题分类存储&#xff0c;生产者向主题写入消息&#xff0c;消费者从主题读取消息。主题的管理是Kafka运维的基础&…

【VLLM】VLLM使用

一 、安装 二、启动入口 VLLM 提供了多种入口方式启动模型&#xff0c;以适应不同的使用场景&#xff08;如命令行交互、API 服务、自定义集成等&#xff09;。除了最常用的 openai.api_server&#xff08;OpenAI 兼容 API 服务&#xff09;&#xff0c;还有以下主要入口&#…

为Github Copilot创建自定义指令/说明/注意事项

GitHub Copilot 是一个强大的 AI 编程助手&#xff0c;通过合理配置自定义指令&#xff0c;可以让它更好地理解和遵循项目特定的编码规范&#xff0c;省的每次提问时输入重复提示语。 目录 方法一&#xff1a;项目级别指令文件&#xff08;推荐&#xff09;方法二&#xff1a…