文件首頁
MySQL Connector/J 開發人員指南
相關文件 下載本手冊
PDF (美國信紙) - 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