私は commons-dbcp を使用して、Sun 1.6 JDK を使用してローカルの Tomcat 6.0.28 コンテナー (Ubuntu パッケージ マネージャーを使用してインストール) に WAR ファイルとしてデプロイされる小さな Spring webapp で MySQL データベースの接続プールを実行しています。デプロイは、Tomcat-maven-plugin-1.1 と goal を使用して Maven から行われtomcat:redeploy
ます。MySQL Connector/J jar は webapp のWEB-INF/lib
ディレクトリにあります。
Tomcat の起動後に初めて webapp が読み込まれると、すべて正常に動作します。ただし、webapp を再デプロイすると、Tomcat が webapp をアンデプロイすると、JDBC ドライバーが登録解除されていないと不平を言います。
code>SEVERE: Web アプリケーション [/taskrun] は JBDC ドライバー [com.mysql.jdbc.Driver] を登録しましたが、Web アプリケーションの停止時に登録解除に失敗しました。メモリ リークを防ぐために、JDBC ドライバーは強制的に登録解除されています。 2011 年 3 月 11 日 11:29:46 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
次に、Tomcat が webapp を再起動すると、データベースへの接続に失敗し、適切なドライバーがないというメッセージが表示されます。
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'com.mysql.jdbc.jdbc2.optional.MysqlDataSource' for connect URL 'jdbc:mysql://127.0.0.1:3306/testdb?autoReconnect=true'
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
... 14 more
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:279)
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 18 more
再デプロイ後に Tomcat を手動で再起動すると、すべて正常に動作します。
クラスがロードされるときにMySQLドライバーがDriverManagerに登録することは知っていますがcom.mysql.jdbc.Driver
、Webアプリケーションが再デプロイされたときにクラスがリロードされないようです。Tomcat の WebappClassLoader はWEB-INF/lib
、webapp がリロードされたときにディレクトリからクラスをリロードすることになっていますか、それともデプロイ間でそれらをメモリに保持しますか? または、デプロイ後に自分で MySQL ドライバーを再登録する必要がありますか?
また、ドライバー jar を Tomcat のディレクトリに移動することを提案する投稿をたくさん見てきましたcommons/lib
が、WAR ファイルの外部にある依存関係はできるだけ避けたいと考えています。
よろしくお願いいたします。