ClassCastException无法将数据源强制转换为javax.sql.ConnectionPoolDataSource

我得到了这个例外:

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

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

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

 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 } 

组态:

  

当我改变“类型”时:

  type="javax.sql.ConnectionPoolDataSource" 

我收到这个警告:

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

导致getConnection()返回NULL。

import:

 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; 

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

所以构造是

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

要么

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

如果DataSource提供或不提供连接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; }