Я использую MySQL temporary tables с connection pooling.Пулы подключений и освобождение временных таблиц по возврату
Обычно временные таблицы, созданные в сеансе, остаются в этом сеансе и отбрасываются при закрытии соединения. Однако, поскольку я использую пул соединений, и физические подключения фактически не закрыты, когда вызывается java.sql.Connection.close()
, я нахожу временные таблицы, которые остаются вокруг и влияют на следующий сеанс.
Это вызывает утечку ресурсов в БД, поскольку временные таблицы не освобождаются сразу, а также конфликты имен из-за столкновений с таблицами.
Интуитивно я ожидал чистого листа, когда я занимаю соединение. Как добиться этого?
- Для MySQL не существует эквивалента SQL Server's
sp_reset_connection
. - Даже если бы это было, я не вижу, как dbcp2 can be configured позвонить, когда соединение будет возвращено.
- Всегда закрывать физическое соединение при возврате в пул может работать, но я не вижу, как можно настроить dbcp2 для этого.
Помимо временных таблиц, эта проблема также влияет:
- User-Defined Variables (i.e.
SET @foo = 1
) обзорное - Освобождение User level locks (i.e.
GET_LOCK()
)
* «Всегда закрывать физическое соединение при возврате в пул может работать» * ... это противоречие в терминах, не так ли? Если соединение закрыто, оно не возвращается в пул. Вы можете попытаться заставить пул освободить соединение db, когда вы закончите, выпустив запрос 'ROLLBACK RELEASE': это почти наверняка будет делать то, что вы пытаетесь сделать, но побочные эффекты будут интересными, и объединение будет бит бессмыслен. В принципе, при объединении ваш код должен быть уверен, что он выполняет свою собственную инициализацию, 'DROP TEMPORARY TABLE IF EXISTS ...' перед созданием таблицы и т. Д. –