3.5.15 客户端会话状态跟踪器

对于 Connection/J 8.0.26 及更高版本:如果在服务器上启用了跟踪 Connector/J 可以接收有关 服务器跟踪的客户端会话状态更改的信息。通过将 Connector/J 连接属性设置 trackSessionStatetrue (默认值为false属性)启用信息接收。

启用该功能后,从服务器接收到的有关会话状态更改的信息存储在 SessionStateChanges对象内,可通过 aServerSessionStateController及其getSessionStateChanges()方法访问:

ServerSessionStateChanges ssc =
  MysqlConnection.getServerSessionStateController().getSessionStateChanges();

InSessionStateChangesSessoinStateChange对象列表,可通过以下 getSessionStateChangesList()方法访问:

List<SessionStateChange> sscList = ssc.getSessionStateChangesList();

每个SessionStateChange都有字段 typevalues,可通过getType()getValues()方法访问。类型及其对应的值描述如下:

表 3.26 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构建之前立即调用侦听器。