2011-08-04 60 views
4

我遇到一個問題加劇,這裏的事實 -拋出:ClassCastException - oracle.jdbc.OraclePreparedStatement

我註冊返回參數具體做,所以我鑄造java.sql.PreparedStatement中到Oracle .jdbc.OraclePreparedStatement。

當我運行這個從Eclipse和它甚至我們的開發服務器上按預期運行,這個偉大的工程。然而,這是當我把它移動到我們的測試服務器裏我打了一個意外的錯誤...

oracle.jdbc.driver.OraclePreparedStatementWrapper cannot be cast 
to oracle.jdbc.OraclePreparedStatement 

這是令人難以置信的奇怪的錯誤我,因爲我敢肯定,OraclePreparedStatement是分配從getStatement()。我調試,發現這是適用於所有環境:

//class oracle.jdbc.driver.OraclePreparedStatementWrapper 
getStatement().getClass(); 

LOCAL和開發環境上都使用我在META-INF/context.xml的設置數據源:

<Resource name="dataSource/dbsubm" auth="Container" 
    type="oracle.jdbc.xa.client.OracleXADataSource" 
    factory="org.apache.naming.factory.BeanFactory" 
    user="*****" password="******" 
    URL="jdbc:oracle:thin:@host:port:db" /> 

測試環境不同,因爲它已經從即使配置是完全一樣的server.xml來一個DataSource。這對我來說是這些環境之間的唯一區別。

可能是什麼問題?爲什麼使用相同的代碼但不同的環境獲得ClassCastException?使用getClass()我可以告訴他們都是相同的類型...請幫助!

+3

您的ojdbc.jar文件在所有機器上的版本是否相同? – darioo

+0

ojdbc驅動程序的版本是什麼,並查看是否有相互之間的任何更改。 –

+0

哇。這可能是! –

回答

8

如果演員穿越類加載器邊界,則會出現ClassCastException。例如,如果返回的語句對象的類是由與您的代碼中加載OraclePreparedStatemen不同的類加載器加載的。這可能是由於在兩個地方有兩個獨立的JDBC jar副本,其中一個由Java EE容器(Tomcat?WAS?)使用,另一個由您的代碼使用。

+1

+1類加載器問題非常微妙和棘手。 –

+1

+1。 @John Strickler:因爲您已經在應用程序的context.xml中定義了LOCAL和DEV的數據源,您可能還在WEB-INF/lib和tomcat/lib中部署了兩次驅動程序? – home

+0

這正是發生的事情。現在我試圖找出如何避免這種衝突......它不會像從一個位置移除它那麼簡單。 –

相關問題