sql >> Database >  >> RDS >> Mysql

Java MySQL JDBC-geheugenlek

Ik had precies hetzelfde probleem. Ik moest 1 verbinding actief houden voor 3 threads en tegelijkertijd moest elke thread veel statements uitvoeren (in de orde van 100k). Ik was heel voorzichtig en ik sloot elke verklaring en elke resultatenset af met een try....eindelijk... algoritme. Op deze manier werden de instructie en de resultatenset altijd gesloten, zelfs als de code op de een of andere manier faalde. Nadat ik de code 8 uur had uitgevoerd, was ik verrast om te ontdekken dat het benodigde geheugen van de eerste 35 MB naar 500 MB ging. Ik genereerde een dump van het geheugen en analyseerde het met Mat Analyzer van Eclipse. Het bleek dat één com.mysql.jdbc.JDBC4Connection-object 445 MB geheugen in beslag nam en enkele openStatements-objecten in leven hield, die op hun beurt ongeveer 135k hashmap-items in leven hielden, waarschijnlijk van alle resultatensets. Dus het lijkt erop dat zelfs als je al je statements en resultatensets sluit, als je de verbinding niet verbreekt, het de verwijzingen naar hen behoudt en de GarbageCollector de bronnen niet kan vrijmaken.

Mijn oplossing :na lang zoeken vond ik deze verklaring van de jongens van MySQL:

"Een snelle test is om "dontTrackOpenResources=true . toe te voegen " naar uw JDBC-URL. Als het geheugenlek weggaat, sluit een codepad in uw toepassing de instructies en resultatensets niet af."

Hier is de link:http://bugs.mysql.com/bug.php? id=5022 . Dus ik probeerde dat en wat denk je? Na 8 uur had ik ongeveer 40 MB geheugen nodig voor dezelfde databasebewerkingen. Misschien zou een verbindingspool raadzaam zijn, maar als dat geen optie is, is dit het beste dat ik tegenkwam.



  1. Voorbeelden van het converteren van 'date' naar 'datetimeoffset' in SQL Server (T-SQL)

  2. vind alle namen met behulp van mysql-query die beginnen met de letter 'a'

  3. Getallen opmaken met een min/plusteken in Oracle

  4. Asynchrone replicatie instellen van Galera Cluster naar standalone MySQL-server met GTID