Я использую временные таблицы MySQL с пулом подключений.
Обычно временные таблицы, созданные в сеансе, остаются в этом сеансе и удаляются при закрытии соединения. Однако, поскольку я использую пул соединений, а физические соединения фактически не закрываются при вызове java.sql.Connection.close()
, я обнаружил, что временные таблицы остаются и влияют на следующий сеанс.
Это вызывает утечку ресурсов в БД, поскольку временные таблицы не освобождаются немедленно, а также конфликты имен из-за конфликтов имен таблиц.
Интуитивно я ожидал, что когда заимствую соединение, все будет с чистого листа. Как этого добиться?
- Кажется, не существует эквивалентного SQL Сервер
sp_reset_connection
для MySQL. - Даже если бы это было, я не могу понять, как dbcp2 можно настроить для его вызова при возврате соединения.
- Всегда закрытие физического соединения при возврате в пул может сработать, но я не вижу, как можно настроить dbcp2 для этого.
Помимо временных таблиц, эта проблема также влияет на:
- Пользовательские переменные (т. е.
SET @foo = 1
) область видимости - Снятие блокировок на уровне пользователя (т.е. _4 _) < / а>
ROLLBACK RELEASE;
. Это почти наверняка сделает то, что вы пытаетесь сделать, но побочные эффекты будут интересными, и объединение станет немного бессмысленным. По сути, при использовании пула ваш код должен быть уверен, что он выполняет свою собственную инициализациюDROP TEMPORARY TABLE IF EXISTS...
перед созданием таблицы и т. Д. - person Michael - sqlbot   schedule 28.12.2016