sql >> データベース >  >> RDS >> Mysql

JavaMySQLJDBCメモリリーク

    私はまったく同じ問題を抱えていました。 3つのスレッドに対して1つの接続をアクティブに保つ必要があり、同時にすべてのスレッドが多くのステートメント(100kのオーダー)を実行する必要がありました。私は非常に注意深く、try ....final...アルゴリズムを使用してすべてのステートメントとすべての結果セットを閉じました。このように、コードが何らかの方法で失敗した場合でも、ステートメントと結果セットは常に閉じられていました。コードを8時間実行した後、必要なメモリが最初の35MBから500MBに増えたことに驚きました。メモリのダンプを生成し、EclipseのMatAnalyzerで分析しました。 1つのcom.mysql.jdbc.JDBC4Connectionオブジェクトが445MBのメモリを使用して、いくつかのopenStatementsオブジェクトを保持し、135kのハッシュマップエントリ(おそらくすべての結果セットから)を保持していることが判明しました。したがって、すべてのステートメントと結果セットを閉じても、接続を閉じないと、それらへの参照が保持され、GarbageCollectorはリソースを解放できないようです。

    私の解決策 :長い検索の結果、MySQLのメンバーからこのステートメントが見つかりました:

    「簡単なテストは、「 dontTrackOpenResources =true」を追加することです。 「JDBCURLに。メモリリークがなくなった場合、アプリケーションの一部のコードパスがステートメントと結果セットを閉じていません。」

    リンクは次のとおりです: http://bugs.mysql.com/bug.php? id =5022 。だから私はそれを試し、何を推測しますか? 8時間後、同じデータベース操作のために約40MBのメモリが必要になりました。接続プールが表示される可能性がありますが、それが不可能な場合は、これが次善の策です。



    1. アダプティブダイナミック統計は12.1.0.2RACのパフォーマンスを低下させます

    2. JSONファイルをSQLServerテーブルにインポートする方法

    3. MariaDB JSON_VALUE()とJSON_QUERY():違いは何ですか?

    4. SQLServerでINNERJOINを使用して複数のテーブルから削除するにはどうすればよいですか