如果伺服器上已啟用追蹤,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
。