2016-12-28 4 views
5

Я использую MySQL temporary tables с connection pooling.Пулы подключений и освобождение временных таблиц по возврату

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

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

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

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

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

+0

* «Всегда закрывать физическое соединение при возврате в пул может работать» * ... это противоречие в терминах, не так ли? Если соединение закрыто, оно не возвращается в пул. Вы можете попытаться заставить пул освободить соединение db, когда вы закончите, выпустив запрос 'ROLLBACK RELEASE': это почти наверняка будет делать то, что вы пытаетесь сделать, но побочные эффекты будут интересными, и объединение будет бит бессмыслен. В принципе, при объединении ваш код должен быть уверен, что он выполняет свою собственную инициализацию, 'DROP TEMPORARY TABLE IF EXISTS ...' перед созданием таблицы и т. Д. –

ответ

0

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