2016-12-28 2 views
5

Ich verwende MySQL temporary tables mit connection pooling.Verbindungspools und Freigabe von temporären Tabellen bei der Rückgabe

Normalerweise bleiben in einer Sitzung erstellte temporäre Tabellen in dieser Sitzung und werden gelöscht, wenn die Verbindung geschlossen wird. Da ich jedoch Verbindungspooling verwende und physische Verbindungen nicht wirklich geschlossen sind, wenn java.sql.Connection.close() aufgerufen wird, finde ich, dass temporäre Tabellen vorhanden sind und die nächste Sitzung beeinflussen.

Dies führt zu Ressourcenverlusten in der Datenbank, da temporäre Tabellen nicht sofort freigegeben werden, sowie Namenskonflikte aufgrund kollidierender Tabellennamen.

Intuitiv erwartete ich eine saubere Weste, wenn ich eine Verbindung ausleihe. Wie erreicht man das?

  • es scheint nicht zu einem Äquivalent SQL Server's sp_reset_connection für MySQL zu sein.
  • Selbst wenn es war, kann ich nicht sehen, wie dbcp2 can be configured es aufrufen, wenn die Verbindung zurückgegeben wird.
  • Das Schließen der physischen Verbindung bei der Rückkehr zum Pool konnte immer funktionieren, aber ich kann nicht sehen, wie dbcp2 dafür konfiguriert werden kann.

Abgesehen von temporären Tabellen, dieses Problem betrifft auch:

+0

* "Das Schließen der physischen Verbindung bei der Rückkehr zum Pool könnte funktionieren" * ... das ist ein Widerspruch in sich, oder? Wenn die Verbindung geschlossen ist, geht es nicht zurück zum Pool. Sie könnten versuchen, den Pool zu zwingen, die db-Verbindung freizugeben, wenn Sie fertig sind, indem Sie die Abfrage 'ROLLBACK RELEASE; absetzen. Das wird fast sicher tun, was Sie versuchen zu tun, aber die Nebenwirkungen werden interessant und Pooling wird zu bisschen sinnlos. Grundsätzlich muss der Code beim Pooling sicher sein, dass er seine eigene Initialisierung, DROP TEMPORARY TABLE IF EXISTS ..., ausführt, bevor er die Tabelle usw. erstellt. –

Antwort

0

Verwendung MySqlConnection.ClearPool (Verbindung); kann arbeiten. Ich habe ähnliche Probleme für GET_LOCK(), MySqlConnection.ClearPool (Verbindung) kann dieses Problem beheben.

Verwandte Themen