![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Anatret |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
Всем привет! Столкнулся с такой проблемой. Использую prepareCall для вызова oracle процедуры. Время от времени выходит ошибка Missing IN or OUT parameter at index. Причем ошибка выходит в случайном порядке то есть в первый раз может отработать без ошибок, второй раз с ошибками в третий раз тоже с ошибкой но может поругаться на другой index хотя переменные и условия одинаковы. В чем дело не могу понять.
Я думал может переменные не инициализируются, проверил, значения присваиваются. Помогите плиз. |
|||
|
||||
| MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 5 Всего: 9 |
Покажите код или заголовок оракловой процедуры и полный текст эксепшна.
|
|||
|
||||
| Anatret |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
PROCEDURE READ_DAT(
v_csn IN NUMBER, v_duration IN NUMBER, v_start_time IN VARCHAR2, v_end_time IN VARCHAR2, v_from_number IN NUMBER, v_on_number IN NUMBER, v_conn_number IN NUMBER, v_centrex_group_number IN NUMBER, v_charge_party_indicator IN NUMBER, v_caller_ctx_number IN NUMBER, v_called_ctx_number IN NUMBER, v_gsvn IN NUMBER, v_bearer_service IN NUMBER, v_trunk_group_out IN NUMBER, v_trunk_group_in IN NUMBER) а ошибка вот такая java.sql.SQLException: Missing IN or OUT parameter at index:: 3 |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Попробовать использовать только локальные переменные.
Добавлено через 2 минуты и 9 секунд И еще раз проверить инициализацию всех переменных, поскольку при указанном способе при ошибк в каком-нибудь read последующие переменные будут не проинициалзированы(правда это важно только для не объектных переменных) |
|||
|
||||
| MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 5 Всего: 9 |
Попробуйте передать методу строковую константу. Если заработает, проверьте инициализацию параметра еще раз.
|
|||
|
||||
| Anatret |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
пробовал локальные, не получилось ( и проверял инициализацию всех переменных до вызова процедуры.
To MaxPayneC "строковую константу" - я не совсем понял. переменная стринг? Это сообщение отредактировал(а) Anatret - 16.6.2010, 13:45 |
|||
|
||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Выложите полный код вместе с проверками(и локальными переменными вместо serial и тп), может чего в запарке пропустили.
Добавлено через 1 минуту и 41 секунду Объедините все try-catch блоки в один. |
|||
|
||||
| MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 5 Всего: 9 |
Anatret,
|
|||
|
||||
| Anatret |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
Вот код я тут уже извращаюсь с while. Try уберу позже я думаю что они не мешают сейчас
а вот лог ошибки из 33 тредов 5 выдал ошибку
Это сообщение отредактировал(а) Anatret - 16.6.2010, 15:40 |
||||
|
|||||
| pathfinder |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Вообщем ошибка понятна.
Вы работаете в многопоточном окружении, при этом не локальные переменные(serial, duration, etc) устанавливаются в блоке синхронизаци, но используются уже вне этого блока. Что приводит к тому что пока один поток пытается установить в cstmt.setString(start_time), другой поток эту же строку зануляет в start_time = read(...). Именно по-этому ошибка появляется спонтанно, должны совпасть: один поток вышел из синхронного блока с не пустыми переменными, другой же уже зашел в этот же самый блок и считал через read(...) пустую(null) строку. Решение проблемы в лоб - сделать все переменные (serial, duration, ...) локальными по отношению к методу run, т.е. вместо того что-бы их объявлять в данных объекта, объявить их в методе run:
Добавлено через 13 минут и 23 секунды Не посмотрел метод read поэтому слегка ошибся. Метод read всегда возращается long по-этому переменные(start_time, end_time) не могут быть null-ами. Ошибка тут из-за cstmt - он у вас статический. По-этому когда один поток уже собрался выполнить cstmt.execute() но происходит переключение на другой поток, который только создал новый cstmt, происходит переключение на предыдущий поток и идет вызов cstmt.execute() с пустыми параметрами. Решение - все переменные, включая cstmt необходимо объявить внутри метода run(). |
|||
|
||||
| Anatret |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
(((( неа. Таже самая ошибка (( но зато логи ошибок не всегда но иногда выходят так
caller_ctx_number= -1 called_ctx_number= -1 хотя не должно. Вот я и думаю что проблема у меня в синхронизации. а вот где ? не знаю. Да и у меня пока так
Это сообщение отредактировал(а) Anatret - 16.6.2010, 15:42 |
||||
|
|||||
| Anatret |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 18.9.2007 Репутация: нет Всего: нет |
to pathfinder ооооо спсб Вам))) получилось! огромное спасибо!!!
|
|||
|
||||
| pathfinder |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 3.3.2010 Репутация: 2 Всего: 10 |
Ошибка вот здесь
cstmt - статическая переменная, как следствие "любое" действие сделанное с ней в одном потоке будет видно и в другом. Разберем на примере двух потоков А и Б. Поток А инициализировал все переменные, создал новый cstmt, установил у него все IN/OUT параметры, но вызвать метод execute() не успел, произошло переключение на поток Б. Поток Б инициализировал все переменные, создал (ВНИМАНИЕ) новый cstmt, и начал у него устанвливать IN/OUT параметры, установил 1, 2, 3, но 4 не успел, произошло переключение обратно на поток А. Поток А продолжает с дого места, где он был прерван, т.е. с вызова execute(). Однако(ВНИМАНИЕ) он будет вызывать execute() у cstmt, что создал поток Б и не успел до конца подготовить, а не тот cstmt что поток А подготовил. Или то же самое в виде последовательного кода:
Это сообщение отредактировал(а) pathfinder - 16.6.2010, 15:57 |
||||||||
|
|||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |