powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Баг PreparedStatement
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Баг PreparedStatement
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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