Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyciek pamięci Java MySQL JDBC

Miałem dokładnie ten sam problem. Musiałem utrzymać aktywne 1 połączenie dla 3 wątków i jednocześnie każdy wątek musiał wykonywać wiele instrukcji (rzędu 100k). Byłem bardzo ostrożny i zamykałem każde stwierdzenie i każdy zestaw wyników za pomocą algorytmu try…finally…. W ten sposób, nawet jeśli kod zawiódł w jakiś sposób, instrukcja i zestaw wyników były zawsze zamknięte. Po uruchomieniu kodu przez 8 godzin z zaskoczeniem stwierdziłem, że potrzebna pamięć wzrosła z początkowych 35 MB do 500 MB. Wygenerowałem zrzut pamięci i przeanalizowałem go za pomocą Mat Analyzer z Eclipse. Okazało się, że jeden obiekt com.mysql.jdbc.JDBC4Connection zajmował 445 MB pamięci, utrzymując przy życiu niektóre obiekty openStatements, które z kolei utrzymywały przy życiu około 135 tys. wpisów hashmap, prawdopodobnie ze wszystkich zestawów wyników. Wygląda więc na to, że nawet jeśli zamkniesz wszystkie instrukcje i zestawy wyników, jeśli nie zamkniesz połączenia, zachowa on do nich odniesienia, a GarbageCollector nie zwolni zasobów.

Moje rozwiązanie :po długich poszukiwaniach znalazłem to oświadczenie od chłopaków z MySQL:

„Szybki test polega na dodaniu „dontTrackOpenResources=true " do adresu URL JDBC. Jeśli przeciek pamięci zniknie, jakaś ścieżka kodu w aplikacji nie zamyka instrukcji i zestawów wyników."

Oto link:http://bugs.mysql.com/bug.php? id=5022 . Więc spróbowałem i zgadnij co? Po 8 godzinach potrzebowałem około 40 MB pamięci na te same operacje na bazie danych. Może pula połączeń byłaby wskazana, ale jeśli to nie jest opcja, to jest to kolejna najlepsza rzecz, z jaką się spotkałem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzę DATETIME z DATE i TIME

  2. Wykonaj PDO z tablicą zawierającą wartości null

  3. Pobierz rekordy z jednej tabeli, w której nie ma rekordu w innej

  4. Co to jest indeks pełnotekstowy i kiedy należy go używać?

  5. Dlaczego MySQL zwraca te same wyniki podczas używania RAND() w instrukcji SELECT?