2009-07-15 24 views
3

我正在運行在Websphere容器中的基於Java的Web應用程序運行查詢。 這個查詢然而,作爲相當簡單,失敗,怪異erorr如下:奇怪的DB2數據庫問題:Websphere Connection Pooling

[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R com.ibm.db2.jcc.b.zd: Invalid data conversion:Requested conversion would result in a loss of precision of 40000 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.q.a(q.java:137) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.q.a(q.java:1189) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.a(ad.java:1217) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.kb(ad.java:2977) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.d(ad.java:1970) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.d(ad.java:2342) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.U(ad.java:489) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.db2.jcc.b.ad.executeQuery(ad.java:472) 
[5/15/09 16:50:33:828 IST] 0000001e SystemErr  R  at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:559) 

該查詢是很簡單:它很簡單,只要

select field1, field2 from <xyz table> where <xyz_pk> = ? 

主鍵是一個INTEGER(4- ),並且數據的值高達99999999.但是,當我運行此查詢時,我的web應用程序在從websphere連接池獲取的連接中運行 ,但它開始因pk值大於35k +而失敗。在jdbc綁定代碼中,我嘗試了一個preparedStatement.setInt()和preparedStatement.setFloat()。但似乎沒有任何工作!它只適用於低於35k +的任何事物,並且在所有情況下都會失敗。

Java的int大小遠遠大於35k +,那麼爲什麼這個查詢會失敗並出現此錯誤?這發生在我的應用程序中,當我使用我選擇的數據庫客戶端嘗試相同的查詢時,正在爲pkey的所有值獲得正確的結果!

以前有沒有人遇到過這個問題?如果是的話,你是如何解決它的?

+0

您能否提供一些示例Java代碼和完整的堆棧跟蹤,以瞭解您使用PreparedStatement.setInt()的情況? java.sql中沒有類位於堆棧跟蹤中。 – NamshubWriter 2009-07-15 14:45:37

回答

1

我的壞..問題是綁定。我的查詢有一個整數和小的int字段,我綁定小到int和int smallint,因此問題。

0

整數沒有精度。在可變綁定的列鏈中必須有一個浮點數或實數。在這種情況下,無論你是從int,Int,long還是一個字節開始都沒關係;整體與真實之間的轉換會觸發警告。查看從列到最後一個變量發生的所有綁定。你準備好的聲明是否重新定義了你的任何字段類型?

0

我認爲您可以做的最好的事情是打開WAS中的JDBC資源適配器的跟蹤日誌,然後查看實際發佈到數據庫的sql。

對不起,沒有更多的幫助。

Karl

0

你可能會發布導致失敗的代碼嗎?

我記得在websphere上有這樣的事情,不得不改變數據庫字段的精度。它必須處理數據庫和java空間的轉換,因爲數據類型遠遠大於數據庫上的數據類型。

我們改變了數據庫的數據類型,改進了一些東西。

0

我記得前一陣子有這個問題。我想我通過直接在SQL語句中轉換值來解決它。事情是這樣的:

選擇十進制(字段1)AS字段1,從場2 ...