Странная проблема с базой данных DB2: пул соединений Websphere - PullRequest
3 голосов
/ 15 июля 2009

Я выполняю запрос из моего веб-приложения на основе Java, работающего в контейнере 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> = ?

Первичный ключ представляет собой INTEGER (4) и имеет данные, которые имеют значения до 99999999. Но, тем не менее, когда я запускаю этот запрос, он запускается в моем веб-приложении для соединения, полученного из пула соединений websphere, он начинает давать сбой при значениях pk> 35k +. В коде привязки jdbc я попытался сделать prepareStatement.setInt () и prepareStatement.setFloat (). Но ничего не работает !! Это просто работает для всего, что ниже 35k + и терпит неудачу для всего, что выше этого.

Размер int в Java намного больше, чем 35k +, так почему этот запрос не будет выполнен с этой ошибкой? Это происходит только из моего приложения, когда я пытаюсь выполнить тот же запрос с клиентом базы данных по своему выбору, для всех значений pkey получаются правильные результаты!

Кто-нибудь сталкивался с этой проблемой раньше? Если да, как ты справился с этим?

Ответы [ 5 ]

1 голос
/ 02 августа 2009

Боже мой .. проблема была в обязательности. Мой запрос содержал целочисленное и маленькое поле int, и я связывал small с int и int с smallint, поэтому возникла проблема.

0 голосов
/ 24 июля 2009

Я помню эту проблему некоторое время назад. Я думаю, что я решил это путем преобразования значения непосредственно в операторе SQL. Примерно так:

выберите DECIMAL (field1) AS field1, field2 из ...

0 голосов
/ 15 июля 2009

Я думаю, что лучшее, что вы можете сделать, - это включить журналы трассировки в WAS для адаптера ресурсов JDBC, а затем посмотреть на sql, который на самом деле является проблемой для БД.

Извините, я не могу помочь.

Karl

0 голосов
/ 16 июля 2009

Не могли бы вы опубликовать код, который вызывает сбой?

Я помню, что что-то подобное было на веб-сфере, и мне приходилось менять точность полей базы данных. Это было связано с преобразованием базы данных и пространством java, в котором на стороне java тип данных был намного больше, чем тип данных в базе данных.

Мы изменили тип данных в базе данных, и все улучшилось.

0 голосов
/ 15 июля 2009

Целые числа не имеют точности. Где-то в цепочке столбцов и переменных должно быть число с плавающей точкой или вещественное число. В этом случае не имеет значения, начинаете ли вы с int, Int, long или даже с байта; преобразование между целым и реальным вызовет предупреждение. Посмотрите на все привязки, которые происходят от столбца до последней переменной. Ваше подготовленное утверждение переопределяет любой из ваших типов полей?

...