Пулы подключений и освобождение временных таблиц по возвращении

Я использую временные таблицы MySQL с пулом подключений.

Обычно временные таблицы, созданные в сеансе, остаются в этом сеансе и удаляются при закрытии соединения. Однако, поскольку я использую пул соединений, а физические соединения фактически не закрываются при вызове java.sql.Connection.close(), я обнаружил, что временные таблицы остаются и влияют на следующий сеанс.

Это вызывает утечку ресурсов в БД, поскольку временные таблицы не освобождаются немедленно, а также конфликты имен из-за конфликтов имен таблиц.

Интуитивно я ожидал, что когда заимствую соединение, все будет с чистого листа. Как этого добиться?

  • Кажется, не существует эквивалентного SQL Сервер sp_reset_connection для MySQL.
  • Даже если бы это было, я не могу понять, как dbcp2 можно настроить для его вызова при возврате соединения.
  • Всегда закрытие физического соединения при возврате в пул может сработать, но я не вижу, как можно настроить dbcp2 для этого.

Помимо временных таблиц, эта проблема также влияет на:


person antak    schedule 28.12.2016    source источник
comment
Всегда закрытие физического соединения при возврате в пул может сработать ... это противоречие с точки зрения терминологии, не так ли? Если соединение закрыто, оно не возвращается в пул. Вы можете попытаться заставить пул освободить соединение с базой данных, когда вы закончите, выполнив запрос ROLLBACK RELEASE;. Это почти наверняка сделает то, что вы пытаетесь сделать, но побочные эффекты будут интересными, и объединение станет немного бессмысленным. По сути, при использовании пула ваш код должен быть уверен, что он выполняет свою собственную инициализацию DROP TEMPORARY TABLE IF EXISTS... перед созданием таблицы и т. Д.   -  person Michael - sqlbot    schedule 28.12.2016


Ответы (1)


используйте MySqlConnection.ClearPool (соединение); может работать. У меня похожие проблемы с GET_LOCK (), MySqlConnection.ClearPool (connection) может решить эту проблему.

person Jeff    schedule 27.10.2017