2011-12-08 22 views
4

私は、Tomcat 7.0.22に配備された最小限のSpring webappを持っています。これは、ページ、コントローラ、サービス、およびSELECTクエリを実行するメソッドを持つDAOで構成されています。Tomcat 7 JDBC接続プールを使用してWebアプリケーションをアンデプロイすると、接続が持続するのはなぜですか?

Webアプリケーションは、新しいTomcat JDBC connection pool使用するように設定されている - ここではWebアプリケーションののcontext.xmlでのリソースの構成です:私は、Webアプリケーションを展開するとき、私は5つの接続がSQLから五$セッションを照会(表示され

<Resource name="jdbc/myDB" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="jdbc:oracle:thin:@blah blah" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      maxActive="15" 
      initialSize="5" 
      maxWait="40000" 
      validationQuery="select 1 from dual" 
      removeAbandoned="true" 
      removeAbandonedTimeout="300" 
      logAbandoned="false" 
      username="user" 
      password="pass" 
      testOnBorrow="true" 
      validationInterval="30000" 
      timeBetweenEvictionRunsMillis="60000" 
      minEvictableIdleTimeMillis="60000" /> 

は、開発者)。 Webアプリケーションをアンデプロイすると、接続は継続します(状態はWAITING)。 Webappを再デプロイするたびに、5つの新しい接続が表示されます。

プールがまだぶら下がっているように見えます。また、Tomcatのマネージャーアプリの「リークを見つける」ボタンは、アプリにメモリがリークしていると伝えます。

webappがアンデプロイされたときにプールを削除する方法を教えてください。

答えて

3

この問題は(ほとんどがそうであるように)自発的でした。私のデータソースはwebappのweb.xmlに設定されていて、JNDI経由で参照していました。私は現在、Springのリファレンスドキュメント(section 13.3.1)に示すように自分のデータソースを作成し、destroyメソッドはデータソースとプールを閉じます。

もし私がServletContextListenerを実装しているクラスのデータソースを閉じる必要があるのであれば、contextDestroyedメソッドでJNDIデータソースを使用する必要がありました。

2

これは、Apache Tomcatのbugzillaを、リファレンスで報告された動作です:

https://issues.apache.org/bugzilla/show_bug.cgi?id=25060

それはTomcatの7.0.11から修正されました。どのバージョンのTomcatを使用していますか?

「アプリケーションレベル」のSpringリファレンスで説明されているようにデータソースを作成すると、多くのアプリケーションと多数のサーバーがある場合、管理タスクに少しオーバーヘッドが生じます。

1

私は同じ問題を抱えていたので、私は春を使うことができなかったので、org.apache.tomcat.jdbc.pool.DataSourceProxyを使ってTomcatデータソースを閉じました。このAPIは、まだ実装されていないJDK DataSourceインターフェイスの機能を提供します。工場= "org.apache.tomcat.jdbc.pool.DataSourceFactory" とServletListener contextDestroyed法を用いても

DataSourceProxy myDataSource = (DataSourceProxy) myDataSource; 
myDataSource.close(); 
+0

ありがとう、私はそのクラスを知らなかった...非常に便利! – Paul

関連する問題