powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Баг PreparedStatement
35 сообщений из 35, показаны все 2 страниц
Баг PreparedStatement
    #39407904
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, пожалуйста, никто не сталкивался ли со следующим багом:
Есть таблица с остатками(Oracle 11.2) : дата, счет,входящий остаток, исходящий остаток.
Мне нужно получить остатки только по нескольким тысячам счетов из нескольких миллионов.
Я написал в PreparedStatement запрос вида
select дата, счет,входящий остаток, исходящий остаток from таблица_остатков
where счет in (?,?,?,?,?)

Входящих параметров(?) в in одна тысяча.
Я их инициализирую в цикле и получается, что для одного счета возвращаются значения из остатков другого счета.
Причем если доабвить что-нибудь типа
where счет in (?,?,?,?,?) order by дата desc, то все ок.
Если
where счет in (?,?,?,?,?) order by дата asc, то баг повторяется.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39407923
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где собственно код?
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39407948
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк,
Код рабочий, чтобы его опубликовать нужно "обезлчивать".
Всю суть проблемы я описал в схематическом виде.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39407951
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nordall,

Код: java
1.
2.
3.
PreparedStatement ps = sqlConnection.prepareStatement("select ... from таблица_остатков where счет in (?,?,?,?,?)");
java.sql.Array array = sqlConnection.createArrayOf("VARCHAR", new Object[]{ "1", "2", "3", "4", "5"}); // здесь нужно перечислить счета
ps.setArray(1, array);
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39407965
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanNordall
У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров.
Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам.

А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408017
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nordall,

Зачем такой бешенный селект?
Построить вьюху с нужными счетами средствами СУБД не судьба?

И есть у меня подозрения, что у этих счетов есть ещё и другие критерии отбора кроме номера.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408050
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallЛокшин Марк,
Код рабочий, чтобы его опубликовать нужно "обезлчивать".
Всю суть проблемы я описал в схематическом виде.

В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть.
Либо ошибка в коде, либо в базе данных. Какая она, кстати?

Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408118
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевУ чела другая проблема.Ок )Сергей АрсеньевЕго устраивает тыща параметров.:-))NordallКод рабочий, чтобы его опубликовать нужно "обезлчивать".А сами данные можете выложить? (конечно, предварительно их "обезлчивав")
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408131
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
Это я пробовал. Принципиально ничего не меняется.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408134
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominNordallЛокшин Марк,
Код рабочий, чтобы его опубликовать нужно "обезлчивать".
Всю суть проблемы я описал в схематическом виде.

В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть.
Либо ошибка в коде, либо в базе данных. Какая она, кстати?

Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод.

Базу я указал - Oracle 11.2.0.4

Значение 1000 - это лимит для количества значений в in.

Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей,
то что будет быстрее - обработать в Java результат трех запросов к базе
или 3000 тысячи раз выполнять запрос по одному счету.
Первый вариант работает быстрее, значит это говнокод?
Инициализируются 1000 параметров естественно в цикле.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408136
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевUsmanNordall
У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров.
Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам.

А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды.

Запрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408142
twr143
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Nordall]Alexey Tominпропущено...




Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей,
то что будет быстрее - обработать в Java результат трех запросов к базе
или 3000 тысячи раз выполнять запрос по одному счету.
Первый вариант работает быстрее, значит это говнокод?
Инициализируются 1000 параметров естественно в цикле.

у меня было такое, лечится

Код: sql
1.
2.
select * from table1 where ID in (1,2,3,4,...,1000) or 
ID in (1001,1002,...,2000)
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408221
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей,
то что будет быстрее - обработать в Java результат трех запросов к базе


Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join

Пока кода нет- бага в вашем коде.

Да, если интересно копаться в говнокоде- найдите минимальное количество ID для возникновенияпроблемы и минимальный запрос. Такнайдёте ошибку себя.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408223
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nordall,
по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408263
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominNordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей,
то что будет быстрее - обработать в Java результат трех запросов к базе


Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join


На боевой системе создавать временную таблицу нереальное решение.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408265
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяNordall,
по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг
Причем тут знания субд и счета???
Счета повторяются и что?
Я делаю select из таблицы балансов.
В ней номер счета всегда уникален за дату.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408293
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallНа боевой системе создавать временную таблицу нереальное решение.

Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие.
А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408306
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominНе вижу проблемы.
Видимо речь о том, что прав на создание объектов нет и их нужно создавать через вышестоящую структуру.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408332
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominNordallНа боевой системе создавать временную таблицу нереальное решение.

Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие.
А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу.
Я не хочу вступать в обсуждение с вами, что есть говнокод и за что уволнять или нет. Для этого есть ПТ.
Сделано это для максимальной производительности. Можете возразить, что это работает медленее?
У всех разные проекты и опыт.
Очень рад, что вам разрешают создавать временные таблицы на продуктивном сервере с десятками проектами пользующимися данными по остаткам.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408336
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nordallorder by дата desc, то все ок.Nordallorder by дата asc, то баг повторяется.И самое главное:NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно.какой именно из запросов? с ASC или с DESC ?
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408343
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно.
А запрос вы откуда взяли для sql plus? Самостоятельно сформировали или из лога оракла?
http://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm#i1011302
А проблема повторяется всегда? Если проблема повторяется всегда, то не понятно каким образом JDBC драйвер вообще может на это повлиять. Если БД выдаёт два разных результата стабильно, то и запросы тоже разные.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408350
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nordall,
обычная ошибка по невнимательности.
Перепроверьте всё с утра и раскайтесь потом)).
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408360
yw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
yw
Гость
Nordall,

скорее всего, действительно, сами где-то лажаете.

У вас всегда передаются одни и те-же 1000 значений?
А есть возможность передать 900 (800,700,..) и проверить наличие бага?
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408383
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallЗначение 1000 - это лимит для количества значений в in.
Ну почти.
Код: plsql
1.
(0,field) in ((0,1),(0,2),...(0,9999))


Хотя, тот еще вариант. :)
Передача через массив выглядит естественней (или через временную таблицу). Но скорее всего у Вас проблема с запросом, особенно если в нем куча вьюшек используется.
Нужно выяснить по трейсу что приходит и где ошибка.
А дальше уже решать. Либо материализовать в некотором слое либо что...
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408394
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если количество параметров изменяется, то такой PreparedStatement в принципе не дает выигрыша в скорости, так как запрос каждый раз надо переписывать (заменять количество ? по числу параметров). Ну и использование Array-параметра выглядит как читерство.
Предлагаю рассмотреть вариант batch-select , с реально работающими PreparedStatement.
В качестве развития идеи, приведенной по ссылке: подготовить несколько запросов с количеством параметров 2 n (например, до 2 7 : 1,2,3,8,16,32,64,128). С помощью них легко можно построить batch с любым числом параметров
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408403
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraПредлагаю рассмотреть вариант batch-select
Так TC и батчит по тыще id за заход. :)
Прям как в статье.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408412
yw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
yw
Гость
ivanra,

А чем обычная работа с коллекциями https://docs.oracle.com/database/121/JJDBC/oraarr.htm#JJDBC28574 не устраивает ?
(ну кроме того, что нужны права на создание типа)
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408422
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yw(ну кроме того, что нужны права на создание типа)
Ну учитывая, что ODCIVarchar2List уже создан и 3000 в него залезает, это не вопрос.
Правда, возможно, придется повозится, чтоб объяснить оптимизатору сколько элементов в этом массиве. :)
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408444
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NordallСделано это для максимальной производительности. Можете возразить, что это работает медленее?

Да, это будет работать не быстрее точно.

NordallОчень рад, что вам разрешают создавать временные таблицы на продуктивном сервере с десятками проектами пользующимися данными по остаткам.

А что такого? Создавал временные таблицы в БД федерального оператора связи, и в банке хорошего уровня. Админы только за.
Более того, приходилось решать временной таблицей проблему именно перформанса- когда оптимизатор не мог связать три таблицы правильно - пришлось перед запросом сливать две из них в одну временную и гонять запросы по ней. Часа 2 экономилось при каждом (ежедневном) запуске, пока схему данных не поменяли ;)
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408510
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевNordallЗначение 1000 - это лимит для количества значений в in.
Ну почти.
Код: plsql
1.
(0,field) in ((0,1),(0,2),...(0,9999))


Хотя, тот еще вариант. :)
Передача через массив выглядит естественней (или через временную таблицу). Но скорее всего у Вас проблема с запросом, особенно если в нем куча вьюшек используется.
Нужно выяснить по трейсу что приходит и где ошибка.
А дальше уже решать. Либо материализовать в некотором слое либо что...
Трэйс наше все. Буду в этом направлении копать.
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408527
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nordall,
вообще было бы интересно посмотреть на интерфейс, в котором пользователю предлагается выбрать 1000+ значений для запроса с in().

Ну и в копилку такое безумное решение средствами оракл без in():
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with ids as (
  select ? as id from dual
  union
  select ? as id from dual
  union
  select ? as id from dual
  -- еще 100500 раз
)
select b.*
from acc_balance b
inner join ids on b.account_id=ids.id
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408552
Nordall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,
разве я писал об интерфейсе?
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408557
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraНу и в копилку такое безумное решение средствами оракл без in():
ну in (или еще лучше exists) можно было бы и union all использовать. :)
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408568
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nordall,
я не полностью сформулировал. Выбор 1000+ значений без возможности сохранения .
Если выбор на интерфейсе, и нет возможности выбор запомнить, то это беда. Если всё же сохраняется, то надо джойнить.
Ну а если это некий массив данных, то логично передать данные на сервер, и там обработать.
Но вот так, 1000 значений в in(), да еще с PreparedStatement? Выглядит не очень. Налицо неправильная постановка задачи, либо признаки copy-paste-style программирования
...
Рейтинг: 0 / 0
Баг PreparedStatement
    #39408570
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraвообще было бы интересно посмотреть на интерфейс, в котором пользователю предлагается выбрать 1000+ значений для запроса с in().

Интерфейс. Иногда такие перлы встречаются...
У меня знакомый работал в IT-отделе, где поставили некоторую программу, которая должна была выводить (в некоторый момент) список всех необработанных документов за этот год.
Делалось это так- вне БД лежал список ID обработанных файлов, и в SQL-запрос вставлялся "not in(...) and not in(...) and not in (...)" (да, три раза). И этот список вставлялся в переменные. Понятно, что за год обработать более 3000 документов было невозможно. По мнению авторов. А офисные работники смогли. И ему надо было как-то это поделие заставить работать. Кажется, "лшние" документы перенесли в какую-то архивную таблицу (соответственно их поиск не находил).
Так что бывает всякое. А потом "баги"
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Баг PreparedStatement
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]