web-dev-qa-db-ja.com

tomcat7-jdbc datasource-これはメモリリークを引き起こす可能性が非常に高い

Tomcatがシャットダウンされると、catalina.outログファイルに次のメッセージが表示されます。 Tomcat 7.xとTomcat JDBCデータソースを使用しています。

Mar 26, 2013 1:17:52 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/my_webapp] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Mar 26, 2013 1:17:52 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/my_webapp] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.

最初のものは、DataSourceが強制的に登録解除されたと主張しているので、それで問題ありません。ただし、次のようにdestroy-methodを構成しているため、奇妙です。

<bean name="dataSource" class="org.Apache.Tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>  

なぜ2番目のものを取得するのかわかりません。 「MySQLステートメントキャンセルタイマー」に関するもの。

どんな助けでも大歓迎です

編集1:私は@Zelldonによって提案された修正を試みましたが、それは最初のエラーを取り除きます。しかし MySQL Statement Cancellation Timer関連する問題が引き続き発生する

23
arahant

戦争ではなくTomcat/libにsql Connector/Driverを配置してみてください。戦争を展開するたびにコネクタ/ドライバが作成されることがあるため、ガベージコレクタがそれらを削除できないことがあり、メモリリークが発生します。そのため、Tomcat/libフォルダーのコネクターを移動してみてください。

次の回答をお読みください。

なぜJDBCドライバーをTomcat_HOME/libフォルダーに配置する必要があるのですか?

MySQLと接続するようにTomcatを設定する方法

34
Zelldon

MySQL jdbcコネクターのこのバグに関連している可能性があります: http://bugs.mysql.com/bug.php?id=65909

MySQLチームが修正するのを待つか、MySQLで正常に動作する Drizzle JDBCコネクター を使用しようとします(URL接続のパラメーターを変更するだけです)。 、この種のバグはありません。

1
Atropo

私はあなたと同じ問題に出会い、mysql-connector-Javaのpomバージョンを8.0.16から8.0.15にロールバックしましたが、問題は解決しました、それはコネクタのバージョンとmysqlの間の不一致だと思います問題を引き起こした

0
Cheng Jiang