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.