web-dev-qa-db-ja.com

重大:プールの初期接続を作成できません-Tomcat 7とcontext.xmlファイル

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に追加されます:

travel

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>

しかし、それは失敗し続けます。

このトラブルを解決する方法は?

9
nazar_art

MySQL jdbcドライバーをクラスパスに追加する必要があります。

MySQLバイナリjarをTomcat libフォルダーに置くか、アプリケーションに追加しますWEB-INF/libフォルダー。

バイナリjarを見つけることができます(それに応じてバージョンを変更します): https://mvnrepository.com/artifact/mysql/mysql-connector-Java/5.1.27 =

12
WeMakeSoftware

このような例外が発生した場合、最も有用な情報は通常、スタックトレースの下部にあります。

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が原因です。

6
matt b

完全に機能する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;
2
bjm88

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

1
Zgpeace