代码之家  ›  专栏  ›  技术社区  ›  Jay

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

  •  3
  • Jay  · 技术社区  · 16 年前

    我正在运行我的基于Java的Web应用程序在WebSphere容器中运行的查询。 但是,这个查询非常简单,使用一个奇怪的erorr失败,如下所示:

    [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> = ?
    

    主键是一个整数(4),数据值高达99999999。但是, 当我在从WebSphere连接池获得的连接上运行此查询时,它开始对pk值>35k+失败。在JDBC绑定代码中,我尝试执行PreparedStatement.setInt()和PreparedStatement.setFloat()。但似乎没什么用!!它只适用于低于35K+的任何东西,而对于高于35K+的任何东西都是失败的。

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

    以前有人面对过这个问题吗?如果是,你是怎么绕过它的?

    5 回复  |  直到 16 年前
        1
  •  1
  •   Jay    16 年前

    我的错。。这个问题具有约束力。我的查询有一个整数和小int字段,我将small绑定到int,将int绑定到small int,因此出现了问题。

        2
  •  0
  •   Kelly S. French    16 年前

    整数没有精度。在列到变量的绑定链中,必须有一个float或real。在这种情况下,无论您是从in t、in t、long还是字节开始,这都无关紧要;whole和real之间的转换都会触发警告。查看从列到最后一个变量的所有绑定。准备好的语句是否重新定义了任何字段类型?

        3
  •  0
  •   Karl    16 年前

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

    对不起,不能再帮你了。

    卡尔

        4
  •  0
  •   Michael Wiles    16 年前

    你能把导致失败的代码贴出来吗?

    我记得在WebSphere上有类似的东西,必须更改数据库字段的精度。它与数据库和Java空间的转换有关,在Java方面,数据类型远远大于数据库中的数据类型。

    我们改变了数据库上的数据类型,事情有所改善。

        5
  •  0
  •   svachon    16 年前

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

    选择十进制(field1)作为field1,field2从…