文档首页
MySQL Connector/J 开发者指南
相关文档 下载本手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


MySQL Connector/J 开发者指南  /  Connector/J 参考  /  客户端会话状态跟踪器

6.15 客户端会话状态跟踪器

如果在服务器上启用了跟踪功能,则 Connector/J 可以接收有关服务器跟踪的客户端会话状态更改的信息。可以通过将 Connector/J 连接属性 trackSessionState 设置为 true(该属性的默认值为 false)来启用接收信息。

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

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

SessionStateChanges 中是一个 SessoinStateChange 对象列表,可以通过 getSessionStateChangesList() 方法访问。

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

每个 SessionStateChange 都有字段 typevalues,可以通过 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 之前,会立即调用侦听器。