2012-12-21 60 views
4

我得到這個異常:ClassCastException異常數據源不能被轉換爲javax.sql.ConnectionPoolDataSource中

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

當我嘗試運行我的Web應用程序(在的Tomcat6)使用Tomcat的JDBC池無縫Tomcat7

工作

我已經包含了這些罐子已經在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。

進口:

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; 
+0

這似乎與發出錯誤的進口。確保你有有效的進口。 – kosa

+0

哪個錯誤導入?你的意思是在代碼中?但它在tomcat7中沒有錯誤地工作 – xybrek

+0

是的在代碼中。我會建議發佈一些代碼並添加更多關於何時出現此錯誤的信息。 – kosa

回答

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提供connectionpooling或不(應該是透明的你)。

參見我的前面的回答另一個問題: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; 
} 
相關問題