4

私はこの例外を受けています:

java.lang.ClassCastException: org.apache.tomcat.jdbc.pool.DataSource cannot be cast to javax.sql.ConnectionPoolDataSource

Tomcat7 とシームレスに連携する tomcat jdbc プールを使用する webapp (Tomcat6) を実行しようとすると

これらの jar は、Tomcat 6 lib フォルダーに既に含まれています。

tomcat-jdbc.jar
tomcat-juli.jar

何が問題なのですか?

アップデート:

protected static Connection getConnection() throws NamingException, SQLException {
    InitialContext cxt = new InitialContext();
    String jndiName = "java:/comp/env/jdbc/MyDBHrd";
    ConnectionPoolDataSource dataSource = (ConnectionPoolDataSource) cxt.lookup(jndiName); // ClassCastException here....
    PooledConnection pooledConnection = dataSource.getPooledConnection();
    Connection conn = pooledConnection.getConnection();
    return conn; // Obtain connection from pool
} 

構成:

<Resource name="jdbc/MyDBHrd"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="5000"
          minIdle="10"
          maxWait="10000"
          initialSize="20"
          removeAbandonedTimeout="120"
          removeAbandoned="true"
          logAbandoned="false"
          minEvictableIdleTimeMillis="30000"
          jmxEnabled="true"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="sa"
          password="password"
          driverClassName="net.sourceforge.jtds.jdbc.Driver"
          url="jdbc:jtds:sqlserver://192.168.114.130/MyDB"/>

「タイプ」を変更すると:

 type="javax.sql.ConnectionPoolDataSource"

次の警告が表示されます。

WARNING: javax.sql.ConnectionPoolDataSource is not a valid class name/type for this JNDI factory.

が NULLgetConnection()を返すようにします。

輸入品:

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.ConnectionPoolDataSource;
import javax.sql.PooledConnection;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
4

1 に答える 1

2

ConnectionPoolDataSourceエンドユーザーとして、直接使用する必要はありません。これは、物理接続 ( ) のファクトリとして使用することを目的としていPooledConnectionます。それPooledConnectionは接続プールに保持されます。を実行するDataSource.getConnectionと、データソースはプールから をチェックアウトし、エンドユーザーとしてPooledConnection使用して取得した論理接続を返し、その論理が閉じPooledConnection.getConnection()られると物理接続をプールに返します。Connection

したがって、構成は

User -- uses --> DataSource (with connectionpooling) -- uses --> ConnectionPoolDataSource

または

ConnectionPoolDataSource --> creates PooledConnection --> DataSource --> returns Connection --> User

a の使用は、それがコネクションDataSourceプーリングを提供するかどうかとDataSourceは関係ありません (透過的であるべきです)。

別の質問に対する私の以前の回答も参照してください: https://stackoverflow.com/a/12651163/466862

つまり、コードを次のように変更する必要があります。

protected static Connection getConnection() throws NamingException, SQLException {
    InitialContext cxt = new InitialContext();
    String jndiName = "java:/comp/env/jdbc/MyDBHrd";
    DataSource dataSource = (DataSource) cxt.lookup(jndiName);
    Connection conn = dataSource.getConnection();
    return conn;
} 
于 2012-12-21T10:09:33.543 に答える