2009-07-15 16 views
3

Ich führe eine Abfrage von meiner Java-basierten Webanwendung aus, die in einem Websphere-Container ausgeführt wird. Diese Abfrage jedoch ziemlich einfach zu sein, nicht mit einem seltsamen erorr wie folgt:Weird DB2-Datenbankproblem: 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) 

Die Abfrage ist ziemlich einfach: es ist so einfach wie

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

Der Primärschlüssel eine INTEGER (4) und hat Daten, die Werte bis zu 99999999 hat. Aber jedoch wenn ich diese Abfrage ausführen in meiner Webanwendung auf eine Verbindung von Websphere-Verbindung Pool ausgeführt wird, beginnt es für PK-Werte> 35k + fehlschlagen. Im jdbc-Bindungscode habe ich versucht, preparedStatement.setInt() und preparedStatement.setFloat() auszuführen. Aber nichts scheint zu funktionieren !! Es funktioniert nur für alles unter 35k + und scheitert für alles darüber hinaus.

Java Int-Größe ist viel größer als 35k +, warum sollte diese Abfrage mit diesem Fehler fehlschlagen? Dies geschieht nur durch meine Anwendung, wenn ich dieselbe Abfrage mit einem Datenbank-Client meiner Wahl versuche, werden die korrekten Ergebnisse für alle Werte des pKey erhalten!

Hat jemand dieses Problem schon einmal erlebt? Wenn ja, wie bist du dazu gekommen?

+0

Können Sie einen Beispiel-Java-Code und einen vollständigen Stack-Trace für den Fall bereitstellen, in dem Sie PreparedStatement.setInt() verwendet haben? Keine Klassen in java.sql befinden sich im Stacktrace. – NamshubWriter

Antwort

1

Mein schlecht .. das Problem war in der Bindung. Meine Abfrage hatte ein ganzzahliges und kleines int-Feld und ich war klein an int und int an smallint, daher das Problem.

0

Ganzzahlen haben keine Genauigkeit. Es muss irgendwo in der Kette von Spalte zu Variable Bindung ein Float oder Real sein. In diesem Fall ist es egal, ob Sie mit einem Int, Int, Long oder sogar einem Byte beginnen. die Umwandlung zwischen ganz und echt würde die Warnung auslösen. Sehen Sie sich alle Bindungen an, die von der Spalte bis zur letzten Variablen passieren. Definiert Ihre vorbereitete Aussage irgendeinen Ihrer Feldtypen?

0

Ich denke, das Beste, was Sie tun können, ist die Ablaufverfolgungsprotokolle in WAS für den JDBC-Ressourcenadapter zu aktivieren und dann auf die SQL, die tatsächlich Probleme mit der DB ist.

Sorry kann nicht viel mehr Hilfe sein.

Karl

0

Könnten Sie vielleicht den Code posten, der den Fehler verursacht?

Ich erinnere mich, so etwas auf der Websphere zu haben und musste die Genauigkeit der Datenbankfelder ändern. Es hatte mit der Konvertierung der Datenbank und des Java-Space zu tun, da auf der Java-Seite der Datentyp viel größer war als der Datentyp auf der Datenbank.

Wir haben den Datentyp in der Datenbank geändert und die Dinge verbessert.

0

Ich erinnere mich, dieses Problem vor einer Weile zu haben. Ich denke, ich habe es gelöst, indem ich den Wert direkt in der SQL-Anweisung umwandelte. Etwas wie folgt aus:

wählen DECIMAL (field1) AS Feld1, Feld2 von ...

Verwandte Themen