【问题标题】:ClassCastException DataSource cannot be cast to javax.sql.ConnectionPoolDataSourceClassCastException DataSource 无法转换为 javax.sql.ConnectionPoolDataSource
【发布时间】:2012-12-08 15:16:03
【问题描述】:

我遇到了这个异常:

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

当我尝试运行使用与 Tomcat7 无缝协作的 tomcat jdbc 池的 web 应用程序(在 Tomcat6 中)时

我已经在 tomcat 6 lib 文件夹中包含了这些 jars:

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.

导致getConnection() 返回NULL。

进口:

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;

【问题讨论】:

  • 这似乎是错误导入的问题。确保您有有效的导入。
  • 哪些错误的导入?你的意思是在代码中?但它在tomcat7中没有错误
  • 在代码中是的。我建议发布一些代码并添加更多关于何时收到此错误的信息。
  • @Nambari 好的,我已经放置了 java 代码
  • Reference 缺少配置,因为我怀疑来自ServerFault

标签: java tomcat jdbc tomcat7


【解决方案1】:

作为最终用户,您永远不必直接使用ConnectionPoolDataSource。它旨在作为物理连接的工厂(PooledConnection)。 PooledConnection 保存在连接池中。当您执行DataSource.getConnection 时,数据源将从池中签出PooledConnection,并将使用PooledConnection.getConnection() 获得的逻辑连接返回给您作为最终用户,并在该逻辑连接时将物理连接返回到池Connection 已关闭。

所以构造是

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

或者

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

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;
} 

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2014-05-30
    • 2017-07-18
    相关资源
    最近更新 更多