|
|
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Добрый день! Подскажите, пожалуйста, никто не сталкивался ли со следующим багом: Есть таблица с остатками(Oracle 11.2) : дата, счет,входящий остаток, исходящий остаток. Мне нужно получить остатки только по нескольким тысячам счетов из нескольких миллионов. Я написал в PreparedStatement запрос вида select дата, счет,входящий остаток, исходящий остаток from таблица_остатков where счет in (?,?,?,?,?) Входящих параметров(?) в in одна тысяча. Я их инициализирую в цикле и получается, что для одного счета возвращаются значения из остатков другого счета. Причем если доабвить что-нибудь типа where счет in (?,?,?,?,?) order by дата desc, то все ок. Если where счет in (?,?,?,?,?) order by дата asc, то баг повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 15:48 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
А где собственно код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 15:59 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Локшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:18 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:25 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
UsmanNordall У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров. Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам. А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:37 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, Зачем такой бешенный селект? Построить вьюху с нужными счетами средствами СУБД не судьба? И есть у меня подозрения, что у этих счетов есть ещё и другие критерии отбора кроме номера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 17:41 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЛокшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть. Либо ошибка в коде, либо в базе данных. Какая она, кстати? Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 18:11 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевУ чела другая проблема.Ок )Сергей АрсеньевЕго устраивает тыща параметров.:-))NordallКод рабочий, чтобы его опубликовать нужно "обезлчивать".А сами данные можете выложить? (конечно, предварительно их "обезлчивав") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:03 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Usman, Это я пробовал. Принципиально ничего не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:32 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallЛокшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть. Либо ошибка в коде, либо в базе данных. Какая она, кстати? Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод. Базу я указал - Oracle 11.2.0.4 Значение 1000 - это лимит для количества значений в in. Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе или 3000 тысячи раз выполнять запрос по одному счету. Первый вариант работает быстрее, значит это говнокод? Инициализируются 1000 параметров естественно в цикле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:45 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевUsmanNordall У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров. Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам. А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды. Запрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:47 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
[quot Nordall]Alexey Tominпропущено... Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе или 3000 тысячи раз выполнять запрос по одному счету. Первый вариант работает быстрее, значит это говнокод? Инициализируются 1000 параметров естественно в цикле. у меня было такое, лечится Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 21:26 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join Пока кода нет- бага в вашем коде. Да, если интересно копаться в говнокоде- найдите минимальное количество ID для возникновенияпроблемы и минимальный запрос. Такнайдёте ошибку себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 06:24 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 06:30 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join На боевой системе создавать временную таблицу нереальное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 08:57 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
вадяNordall, по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг Причем тут знания субд и счета??? Счета повторяются и что? Я делаю select из таблицы балансов. В ней номер счета всегда уникален за дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 08:59 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallНа боевой системе создавать временную таблицу нереальное решение. Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие. А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 09:40 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominНе вижу проблемы. Видимо речь о том, что прав на создание объектов нет и их нужно создавать через вышестоящую структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:03 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallНа боевой системе создавать временную таблицу нереальное решение. Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие. А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу. Я не хочу вступать в обсуждение с вами, что есть говнокод и за что уволнять или нет. Для этого есть ПТ. Сделано это для максимальной производительности. Можете возразить, что это работает медленее? У всех разные проекты и опыт. Очень рад, что вам разрешают создавать временные таблицы на продуктивном сервере с десятками проектами пользующимися данными по остаткам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:34 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordallorder by дата desc, то все ок.Nordallorder by дата asc, то баг повторяется.И самое главное:NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно.какой именно из запросов? с ASC или с DESC ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:42 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно. А запрос вы откуда взяли для sql plus? Самостоятельно сформировали или из лога оракла? http://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm#i1011302 А проблема повторяется всегда? Если проблема повторяется всегда, то не понятно каким образом JDBC драйвер вообще может на это повлиять. Если БД выдаёт два разных результата стабильно, то и запросы тоже разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:48 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, обычная ошибка по невнимательности. Перепроверьте всё с утра и раскайтесь потом)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:53 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, скорее всего, действительно, сами где-то лажаете. У вас всегда передаются одни и те-же 1000 значений? А есть возможность передать 900 (800,700,..) и проверить наличие бага? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:04 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЗначение 1000 - это лимит для количества значений в in. Ну почти. Код: plsql 1. Хотя, тот еще вариант. :) Передача через массив выглядит естественней (или через временную таблицу). Но скорее всего у Вас проблема с запросом, особенно если в нем куча вьюшек используется. Нужно выяснить по трейсу что приходит и где ошибка. А дальше уже решать. Либо материализовать в некотором слое либо что... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:28 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Если количество параметров изменяется, то такой PreparedStatement в принципе не дает выигрыша в скорости, так как запрос каждый раз надо переписывать (заменять количество ? по числу параметров). Ну и использование Array-параметра выглядит как читерство. Предлагаю рассмотреть вариант batch-select , с реально работающими PreparedStatement. В качестве развития идеи, приведенной по ссылке: подготовить несколько запросов с количеством параметров 2 n (например, до 2 7 : 1,2,3,8,16,32,64,128). С помощью них легко можно построить batch с любым числом параметров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39408293&tid=2123124]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 349ms |

| 0 / 0 |
