对于 Connection/J 8.0.26 及更高版本:如果在服务器上启用了跟踪
Connector/J 可以接收有关
服务器跟踪的客户端会话状态更改的信息。通过将 Connector/J 连接属性设置
trackSessionState
为true
(默认值为false
属性)启用信息接收。
启用该功能后,从服务器接收到的有关会话状态更改的信息存储在
SessionStateChanges
对象内,可通过 aServerSessionStateController
及其getSessionStateChanges()
方法访问:
ServerSessionStateChanges ssc =
MysqlConnection.getServerSessionStateController().getSessionStateChanges();
InSessionStateChanges
是
SessoinStateChange
对象列表,可通过以下
getSessionStateChangesList()
方法访问:
List<SessionStateChange> sscList = ssc.getSessionStateChangesList();
每个SessionStateChange
都有字段
type
和values
,可通过getType()
和
getValues()
方法访问。类型及其对应的值描述如下:
表 6.23 SessionStateChange 类型和值
类型 | 值列表中的值数 | 价值观 |
---|---|---|
SESSION_TRACK_SYSTEM_VARIABLES |
2个 | 更改的系统变量的名称及其新值 |
SESSION_TRACK_SCHEMA |
1个 | 新模式名称 |
SESSION_TRACK_STATE_CHANGE |
1个 | “1”或“0” |
SESSION_TRACK_GTIDS |
1个 | 服务器报告的 GTID 列表 |
SESSION_TRACK_TRANSACTION_CHARACTERISTICS |
1个 | 交易特征声明 |
SESSION_TRACK_TRANSACTION_STATE |
1个 | 交易状态记录 |
Connector/J 仅从服务器发送的最新 OK 数据包中接收更改。使用
getSessionStateChanges()
,可能会遗漏由 Connector/J 发出的中间查询返回的一些更改。但是,也可以使用 来接收会话状态更改信息
SessionStateChangesListener
,这必须
ServerSessionStateController
使用
addSessionStateChangesListener()
方法注册。下面的例子
SessionStateChangesListener
在一个类中实现,该类也提供了打印变化信息的方法:
class SSCListener implements SessionStateChangesListener {
ServerSessionStateChanges changes = null;
public void handleSessionStateChanges(ServerSessionStateChanges ch) {
this.changes = ch;
for (SessionStateChange change : ch.getSessionStateChangesList()) {
printChange(change);
}
}
private void printChange(SessionStateChange change) {
System.out.print(change.getType() + " == > ");
int pos = 0;
if (change.getType() == ServerSessionStateController.SESSION_TRACK_SYSTEM_VARIABLES) {
// There are two values with this change type, the system variable name and its new value
System.out.print(change.getValues().get(pos++) + "=");
}
System.out.println(change.getValues().get(pos));
}
}
SessionStateChangesListener listener = new SSCListener();
MysqlConnection.getServerSessionStateController().addSessionStateChangesListener(listener);
使用已注册的
SessionStateChangesListener
,用户可以访问所有中间结果,但侦听器可能会减慢查询结果的传递速度。这是因为在 OK 数据包被 Connector/J 消费后,在ResultSet
构建之前立即调用侦听器。