sql >> Databáze >  >> RDS >> Mysql

Únik paměti Java MySQL JDBC

Měl jsem úplně stejný problém. Potřeboval jsem udržet 1 připojení aktivní pro 3 vlákna a zároveň každé vlákno muselo provádět spoustu příkazů (řádově 100k). Byl jsem velmi opatrný a uzavřel jsem každý příkaz a každou sadu výsledků pomocí algoritmu try....konečně... Tímto způsobem, i když kód nějakým způsobem selhal, příkaz a sada výsledků byly vždy uzavřeny. Po spouštění kódu po dobu 8 hodin jsem byl překvapen, když jsem zjistil, že potřebná paměť se zvýšila z původních 35 MB na 500 MB. Vygeneroval jsem výpis paměti a analyzoval jsem to pomocí Mat Analyzer od Eclipse. Ukázalo se, že jeden objekt com.mysql.jdbc.JDBC4Connection zabíral 445 MB paměti a udržoval při životě některé objekty openStatements, které zase udržovaly při životě kolem 135 000 záznamů hashmap, pravděpodobně ze všech sad výsledků. Zdá se tedy, že i když zavřete všechny příkazy a sady výsledků, pokud neuzavřete připojení, zachová si na ně odkazy a GarbageCollector nemůže uvolnit prostředky.

Moje řešení :po dlouhém hledání jsem našel toto prohlášení od kluků z MySQL:

"Rychlým testem je přidat "dontTrackOpenResources=true " na vaši adresu URL JDBC. Pokud únik paměti zmizí, některá cesta kódu ve vaší aplikaci neuzavře příkazy a sady výsledků."

Zde je odkaz:http://bugs.mysql.com/bug.php? id=5022 . Tak jsem to zkusil a hádejte co? Po 8 hodinách jsem potřeboval asi 40 MB paměti pro stejné databázové operace. Možná by byl vhodný fond připojení, ale pokud to není možné, je to další nejlepší věc, kterou jsem našel.



  1. Upozornění:mysql_fetch_array() očekává, že parametr 1 bude zdrojem, booleovský zadaný v

  2. Jak přiřadit výsledek exec k proměnné sql?

  3. Jak funguje funkce LPAD() v MySQL

  4. Jak obnovit soubor výpisu PostgreSQL do databází Postgres?