2016-12-28 28 views
5

Używam MySQL's temporary tables z connection pooling.Pule połączeń i zwalnianie tabel tymczasowych po powrocie

Zazwyczaj tabele tymczasowe utworzone w sesji pozostają w tej sesji i są usuwane po zamknięciu połączenia. Jednak ponieważ używam łączenia połączeń, a połączenia fizyczne nie są faktycznie zamykane po wywołaniu java.sql.Connection.close(), znajduję tymczasowe tabele pozostające w pobliżu i wpływające na następną sesję.

Powoduje to wyciek zasobów z bazy danych, ponieważ tabele tymczasowe nie są natychmiast zwalniane, a także zderzenia nazw ze względu na zderzające się nazwy tabel.

Intuicyjnie spodziewam się czystej karty pożyczyć połączenie. Jak można to osiągnąć?

  • Nie istnieje odpowiednik dla MySQL SQL Server's sp_reset_connection.
  • Nawet jeśli był, nie widzę, jak zadzwonić pod numer dbcp2 can be configured po zwrocie połączenia.
  • Zawsze zamykanie połączenia fizycznego po powrocie do puli może działać, ale nie widzę sposobu, w jaki można również skonfigurować dbcp2.

Oprócz tabelach przejściowych, problem ten dotyczy także:

+0

* "Zawsze zamykanie połączenia fizycznego po powrocie do basenu może działać" * ... to jest sprzeczność w rozumieniu, prawda? Jeśli połączenie zostanie zamknięte, nie wróci ono do puli. Możesz spróbować zmusić pulę do zwolnienia połączenia db, gdy skończysz, wysyłając zapytanie 'ROLLBACK RELEASE;' To prawie na pewno zrobi to, co próbujesz zrobić, ale efekty uboczne będą interesujące i połączenie stanie się bit bez sensu. Zasadniczo, przy łączeniu, twój kod musi być pewny, że sam inicjuje, 'UPUŚĆ TABORĘ CZASOWĄ, JEŻELI ISTNIEJĄ ... ...' przed utworzeniem tabeli itp. –

Odpowiedz

0

stosowania MySqlConnection.ClearPool (połączenie); może pracować. Mam podobne problemy do tego dla GET_LOCK(), MySqlConnection.ClearPool (połączenie) może rozwiązać ten problem.