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 имеет поля 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, который должен быть зарегистрирован с 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 будет сконструирован.
© 2025 Oracle
Licensed under the GPLv2 License.