2.26 开启/关闭client_found_rows权能标志
2.26.1 介绍&背景
在客户端与服务器在初次连接的时候,服务端发送初始化握手包时会带上自己所支持的权能标志;客户端接收后会对服务器发送的权能标志进行筛选,保留自身所支持权能标志且返回给服务器,从而保证服务器与客户端通讯的兼容性。因此权能标志是在初次连接确定,不能动态修改。
在DBLE中后端连接都是使用连接池预先建立好的,导致与前端请求不同导致行为不一样;因此在dble管理端中新增了对client_found_rows权能标志更改和后端连接池的刷新。
2.26.1.1 client_found_rows的作用
若初次连接handshake协议中启用client_found_rows权能标志,表示在DML等操作时结果集里返回发现行(found rows),而不是影响行(affect rows)。
2.26.1.2 client_found_rows值设定:
MYSQL客户端:默认关闭client_found_row;(则返回结果集里为affect rows)
JDBC:默认开启client_found_rows;(则返回结果集里为found rows)
2.26.1.3 JDBC中useAffectedRows与client_found_row的关系
useAffectedRows=true 即关闭client_found_rows
useAffectedRows=false(默认) 即开启client_found_rows
2.26.2 具体
2.26.2.1 在bootstrap.cnf里增加参数
#是否开启client_found_rows权能标志,默认关闭
-DcapClientFoundRows=false
2.26.2.2 管理端口增加命令
show @@cap_client_found_rows; -- 查询client_found_row权能标志开启状态 0-关闭 1-开启
disable @@cap_client_found_rows; -- 关闭client_found_row权能标志
enable @@cap_client_found_rows; -- 开启client_found_row权能标志
注意: 如果在不停dble服务的情况下,更改该权能标志,为了保证与后端连接的mysql的该权能标志一致,(强调)需要刷新连接池;否则insert的结果集不正确
2.26.3 验证
step1. 启动dble(默认关闭client_found_rows)
step2. 管理用户身份开启client_found_rows权能标志
mysql -uman1 -h192.xx.xx.xx -P9066 -p654321
enable @@cap_client_found_rows;
step3. 用户身份尝试登录
- 在3.20.10.0版本中,登录失败,提示客户端与dble内存中的client_found_rows权能标志不一致
mysql -uroot -h192.xx.xx.xx -P8066 -p123456 ERROR 1045 (HY000): The client requested CLIENT_FOUND_ROWS capabilities does not match, in the manager use show @@cap_client_found_rows check latest status.
- 在3.20.10.1及后续版本,登录成功,但会在dble.log中提示客户端与dble内存中的client_found_rows权能标志不一致,此时返回结果以dble的client_found_rows值为准
the client requested CLIENT_FOUND_ROWS capabilities is 'found rows', dble is configured as 'affect rows',pls set the same. or the client requested CLIENT_FOUND_ROWS capabilities is 'affect rows', dble is configured as 'found rows',pls set the same.