Tomcat 7.0.52
でプロジェクトを実行し、context.xml
ファイルを介してDBに初期化しようとしました。
しかし、それは多くの例外を投げます、そこで何が間違っているのかわかりませんでした。
コンソール出力は次のとおりです。
Java.sql.SQLException: com.mysql.jdbc.Driver
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.Java:254)
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.Java:182)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.Java:701)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.Java:635)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.Java:486)
at org.Apache.Tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.Java:144)
at org.Apache.Tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.Java:116)
at org.Apache.Tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.Java:103)
at org.Apache.Tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.Java:554)
at org.Apache.Tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.Java:242)
at org.Apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.Java:141)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.Java:321)
完全な スタックトレース です。
以下は Tomcat catalina log への出力です
web.xmlのスニペット:
<resource-ref>
<description>Travel Agency Datasource</description>
<res-ref-name>jdbc/onlinedb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
context.xml:
<Context>
<Resource name="jdbc/onlinedb"
type="javax.sql.DataSource"
factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
maxActive="20" maxIdle="10"
maxWait="-1"
username="root"
password="secret"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/travelagency?characterEncoding=utf8"/>
</Context>
ConnectionManagerクラス:
public class ConnectionManager {
private static Logger log = Logger.getLogger(ConnectionManager.class);
public static Connection getConnection() throws SQLException {
Connection con = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("Java:/comp/env");
DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinedb");
con = datasource.getConnection();
} catch (NamingException e) {
log.error(e);
}
return con;
}
}
mysql-connector-Java-5.1.27-bin.jar
がcpに追加されます:
Context.xmlファイルのコンテンツを変更しようとしました:
<resource-env-ref>
<description>Travel Agency Datasource</description>
<resource-env-ref-name>jdbc/onlinedb</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
しかし、それは失敗し続けます。
このトラブルを解決する方法は?
MySQL jdbcドライバーをクラスパスに追加する必要があります。
MySQLバイナリjarをTomcat libフォルダーに置くか、アプリケーションに追加しますWEB-INF/libフォルダー。
バイナリjarを見つけることができます(それに応じてバージョンを変更します): https://mvnrepository.com/artifact/mysql/mysql-connector-Java/5.1.27 =
このような例外が発生した場合、最も有用な情報は通常、スタックトレースの下部にあります。
Caused by: Java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:366)
...
at org.Apache.Tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.Java:246)
問題は、Tomcatがcom.mysql.jdbc.Driver
を見つけられないことです。これは通常、Tomcatがそれを見つけることを期待している場所(つまりwebapps/<yourwebapp>/WEB-INF/lib
ディレクトリ)にないMySQLドライバーを含むJARが原因です。
完全に機能するcontext.xmlのセットアップが調整された後、この例外も処理しました。 context.xmlに環境の詳細が必要ないため、それらを取り出してこのエラーを見ました。 System Property JVM -D argsに基づくコードでこのデータソースリソースを完全に作成する必要があることに気付きました。
User/pwd/Hostのみが削除された元のエラー:org.Apache.Tomcat.jdbc.pool.ConnectionPool init SEVERE:プールの初期接続を作成できません。
Context.xmlのコンテンツ全体を削除して、これを試してください。最初の接続を使用する前に、アプリケーションサーバーの起動時にデータソースオブジェクトを初期化します。 Springを使用している場合、これは@Bean Datasourceコンストラクターの@Configuration Beanで行うとよいでしょう。
使用するパッケージ:org.Apache.Tomcat.jdbc.pool。*
PoolProperties p = new PoolProperties();
p.setUrl(jdbcUrl);
p.setDriverClassName(driverClass);
p.setUsername(user);
p.setPassword(pwd);
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setValidationQueryTimeout(100);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(5);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(5);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
"org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer");
org.Apache.Tomcat.jdbc.pool.DataSource ds = new org.Apache.Tomcat.jdbc.pool.DataSource();
ds.setPoolProperties(p);
return ds;
Sprint-boot(2.1.1)を使用し、mysqlバージョンは8.0.13です。 pomに依存関係を追加し、問題を解決します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>8.0.13</version>
</dependency>
MySQL Connector/J"8.0.13リンク: https://mvnrepository.com/artifact/mysql/mysql-connector-Java/8.0.1
MySQL Connector/J"すべてのバージョンリンク: https://mvnrepository.com/artifact/mysql/mysql-connector-Java