我收到此异常:
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.
导致getConnection()返回NULL。
getConnection()
进口:
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直接使用Direct。它旨在用作物理连接的工厂(PooledConnection)。那PooledConnection被保留在连接池中。当执行a时DataSource.getConnection,数据源将从PooledConnection池中检出a ,并PooledConnection.getConnection()以最终用户的身份向您返回获得的逻辑连接,并在Connection关闭该逻辑时将物理连接返回到池中。
ConnectionPoolDataSource
PooledConnection
DataSource.getConnection
PooledConnection.getConnection()
Connection
所以构造是
User -- uses --> DataSource (with connectionpooling) -- uses --> ConnectionPoolDataSource
要么
ConnectionPoolDataSource --> creates PooledConnection --> DataSource --> returns Connection --> User
a的使用DataSource独立于是否DataSource提供连接缓冲的事实(它对您应该透明)。
DataSource
换句话说,您的代码应更改为:
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; }