如果在服务器上启用了跟踪功能,则 Connector/J 可以接收有关服务器跟踪的客户端会话状态更改的信息。可以通过将 Connector/J 连接属性 trackSessionState
设置为 true
(该属性的默认值为 false
)来启用接收信息。
启用该功能后,从服务器接收的有关会话状态更改的信息将存储在 SessionStateChanges
对象中,可以通过 ServerSessionStateController
及其 getSessionStateChanges()
方法访问该对象。
ServerSessionStateChanges ssc =
MysqlConnection.getServerSessionStateController().getSessionStateChanges();
SessionStateChanges
中是一个 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
接收会话状态更改信息,该侦听器必须使用 addSessionStateChangesListener()
方法在 ServerSessionStateController
中注册。以下示例在一个类中实现了 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
,用户可以访问所有中间结果,但侦听器可能会降低查询结果的传送速度。这是因为在 Connector/J 使用 OK 数据包后、在构造 ResultSet
之前,会立即调用侦听器。