奇怪的DB2数据库问题:Websphere Connection Pooling

问题描述:

我正在运行在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

我的坏..问题是绑定。我的查询有一个整数和小的int字段,我绑定小到int和int smallint,因此问题。

整数没有精度。在可变绑定的列链中必须有一个浮点数或实数。在这种情况下,无论你是从int,Int,long还是一个字节开始都没关系;整体与真实之间的转换会触发警告。查看从列到最后一个变量发生的所有绑定。你准备好的声明是否重新定义了你的任何字段类型?

我认为您可以做的最好的事情是打开WAS中的JDBC资源适配器的跟踪日志,然后查看实际发布到数据库的sql。

对不起,没有更多的帮助。

Karl

你可能会发布导致失败的代码吗?

我记得在websphere上有这样的事情,不得不改变数据库字段的精度。它必须处理数据库和java空间的转换,因为数据类型远远大于数据库上的数据类型。

我们改变了数据库的数据类型,改进了一些东西。

我记得前一阵子有这个问题。我想我通过直接在SQL语句中转换值来解决它。事情是这样的:

选择十进制(字段1)AS字段1,从场2 ...