奇怪的DB2数据库问题:Websphere连接池

时间:2009-07-15 14:16:11

标签: java jdbc java-ee db2 websphere

我正在运行在Websphere容器中的基于java的Web应用程序运行查询。 然而,这个查询很简单,失败了,如下所示:#/ p>

[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值&gt; 35K +。在jdbc绑定代码中,我尝试执行prepareStatement.setInt()和preparedStatement.setFloat()。但似乎没有任何作品!它适用于任何低于35k +的任何东西,并且无法满足上述所有要求。

Java的int大小远大于35k +,那么为什么这个查询会因为这个错误而失败?这只发生在我的应用程序中,当我使用我选择的数据库客户端尝试相同的查询时,正在获得pkey的所有值的正确结果!

以前有人遇到过这个问题吗?如果是的话,你是怎么解决的?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

整数没有精度。在列链中的某个地方必须有一个float或real到变量绑定。在这种情况下,无论是以int,Int,long还是以字节开头都无关紧要;整体和真实之间的转换会触发警告。查看从列到最后一个变量发生的所有绑定。您准备好的陈述是否重新定义了您的任何字段类型?

答案 2 :(得分:0)

我认为您可以做的最好的事情是在WAS中为JDBC资源适配器打开跟踪日志,然后查看实际上是DB的问题的SQL。

抱歉无法提供更多帮助。

卡尔

答案 3 :(得分:0)

您是否可以发布导致失败的代码?

我记得在websphere上有这样的东西,不得不改变数据库字段的精度。它与数据库和java空间的转换有关,在java端,数据类型远远大于数据库上的数据类型。

我们更改了数据库中的数据类型并改进了一些内容。

答案 4 :(得分:0)

我记得刚才有这个问题。我想我是通过直接在SQL语句中转换值来解决它的。像这样:

选择DECIMAL(field1)AS field1,field2 from ...