6

Tomcat-7.0.33 を使用しています。Tomcat JNDI データソースを使用する Spring 3.0.1 および JPA。バックエンドで ojdbc6.jar (最新) を使用する Oracle 10g。

アプリケーションをアンデプロイしようとすると、いくつかの Oracle クラスがリークしているようです。古い ojdbc14.jar ドライバーを使用している場合、これは表示されませんが、新しいドライバーを必要とする Oracle 11g に移行しているため、これらのドライバーは使用できません。これは Oracle ドライバーのバグだと思いますか? これらのリソースをクリーンアップするためにできることはありますか? データベース接続プールやその他のものを無駄に閉じようとしました...

Tomcat の接続プールを使用しないほうがよいでしょうか? サーバーをデータベースに接続したいのですが、必要に応じて独自に接続することもできます...

サーバー コンソールには次のように表示されます。

17505 INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - 永続ユニット 'myManager' の JPA EntityManagerFactory を閉じています 17515 INFO org.apache.tiles.access.TilesAccess - コンテキストの TilesContext を削除しています: org.springframework.web.servlet.view.tiles2。 SpringTilesApplicationContextFactory$SpringWildcardServletTilesApplicationContext 2012 年 12 月 6 日 6:41:29 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks .lang.ThreadLocal@1468544]) およびタイプ [java.lang.Class] の値 (値 [class oracle.sql.AnyDataFactory]) が、Web アプリケーションの停止時に削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 18:41:29 組織。apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE: Web アプリケーション [/myApp] は、タイプ [java.lang.ThreadLocal] のキー (値 [java.lang.ThreadLocal@d73b31]) とタイプ [java] の値を持つ ThreadLocal を作成しました.lang.Class] (値 [class oracle.sql.TypeDescriptorFactory]) ですが、Web アプリケーションが停止したときに削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 6:41:29 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE: Web アプリケーション [/myApp] は、タイプ [java.lang.ThreadLocal] (値 [java.lang. ThreadLocal@13​​aae39]) およびタイプ [java.lang.Class] の値 (値 [class oracle.sql.TypeDescriptorFactory]) が、Web アプリケーションの停止時に削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 6:41:29 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE: Web アプリケーション [/myApp] は、タイプ [java.lang.ThreadLocal] (値 [java.lang. ThreadLocal@18443b1]) およびタイプ [java.lang.Class] の値 (値 [class oracle.sql.AnyDataFactory]) が、Web アプリケーションの停止時に削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 6:41:34 PM org.apache.catalina.startup.HostConfig deleteRedeployResources INFO: アンデプロイ コンテキスト [/myApp] Web アプリケーション [/myApp] は、[java.lang.ThreadLocal] タイプのキー (値 [java.lang.ThreadLocal@18443b1]) と [java.lang.Class] タイプの値 (値 [class oracle .sql.AnyDataFactory]) ですが、Web アプリケーションが停止したときにそれを削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 6:41:34 PM org.apache.catalina.startup.HostConfig deleteRedeployResources INFO: アンデプロイ コンテキスト [/myApp] Web アプリケーション [/myApp] は、[java.lang.ThreadLocal] タイプのキー (値 [java.lang.ThreadLocal@18443b1]) と [java.lang.Class] タイプの値 (値 [class oracle .sql.AnyDataFactory]) ですが、Web アプリケーションが停止したときにそれを削除できませんでした。スレッドは、メモリ リークの可能性を回避するために、時間の経過とともに更新されます。2012 年 12 月 6 日 6:41:34 PM org.apache.catalina.startup.HostConfig deleteRedeployResources INFO: アンデプロイ コンテキスト [/myApp]

ContextListener を追加して DBCP 接続を手動で閉じようとしましたが、役に立ちませんでした。

InitialContext initial = new InitialContext();

DataSource ds = (DataSource) initial.lookup("java:/comp/env/jdbc/myDS");

if (ds.getConnection() == null) {
    throw new RuntimeException("I failed to find the datasource");
}

LOG.debug("Found datasource.  Closing...");
BasicDataSource bds = (BasicDataSource) ds;

bds.close();
4

2 に答える 2

9

問題を理解しました... Toni は良い提案をしました (ただし、ドライバーの登録を解除すると、アプリがリロードされたときにドライバーが利用できなくなります!)。

私たちの場合、Web アプリと Tomcat/lib ディレクトリに誤って ojdbc6.jar を含めていました。これにより、Tomcat がクラスローダーを使用してオブジェクトを作成した可能性があります。したがって、アプリケーションがアンロードされているとき、Tomcat の DBCP プールには、アプリケーション内のクラスへのハンドルがまだ開いていました。

WEB-INF/lib から ojdbc6.jar を削除すると、問題が解決しました。

于 2012-12-12T20:44:46.583 に答える