powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность и INSERT в Oracle
16 сообщений из 16, страница 1 из 1
Многопоточность и INSERT в Oracle
    #34351779
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Имеется несколько потоков создающие несколько экземпляров класса. Один из методов этого класса производит инсерт в таблицу Оракла. Таблицы создаются автоматически, т.е. имена таблиц уникальны для различных потоков. Коннекшен к ораклу один на все потоки. Инсерт производится так, имена таблиц меняются и все это в цикле:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
String query = "INSERT INTO INFO20070223095701860 (name1, name2, name3, name4, name5, name6, name7) VALUES (?, ?, to_date(?, 'dd.mm.yyyy hh24:mi:ss'), ?, ?, ?, ?)"

PreparedStatement queryStmt = Conn.prepareStatement(query);

queryStmt.setString( 1 , ((String[])d[ 0 ].getArList().get( 0 ))[i]);
queryStmt.setString( 2 , ((String[])d[ 1 ].getArList().get(i))[j]);
queryStmt.setString( 3 , ((String[])d[ 2 ].getArList().get(j + shift10))[k]);
queryStmt.setString( 4 , ((String[])d[ 3 ].getArList().get(k + shift8))[l]);
queryStmt.setString( 5 , ((String[])d[ 4 ].getArList().get(l + shift6))[m]);
queryStmt.setString( 6 , ((String[])d[ 5 ].getArList().get(m + shift4))[n]);
queryStmt.setString( 7 , ((String[])d[ 6 ].getArList().get(n + shift2))[o]);

queryStmt.executeUpdate();
queryStmt.close(); 

Проблема в том, что когда метод с инсертом выполняется различними потоками в одно время, некоторые строки в таблицы просто не попадают. Хотя читая лог файл, вижу что на инсерт посылаются все строки. Хоть экземпляры объектов и различны для разных потоков, но на всякий случай объявлял метод как synchronized. Все равно не помогло... Т.е. в процессы выполнения часть строк не инсертится и ошибки не возникает... Если методы выполняются не в одно время - все ОК.
Помогите советом, плиз!!
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34351838
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Расскажите ораклистам, что вы налету создаете таблицы, и вам расскажут, что они про вас думают. Но это не в тему.
2. Есть подозрение, что вы не выполняете коммит (commit).
3. Вы спросите - а как же попадают другие строки? Дело в том, что создание таблицы это DDL операция, а она выполняет автокоммит. Следовательно, все, что было заинсерчено ранее - коммитится, а все строки, которые добавлялись, и после них В ЭТОЙ СЕССИИ таблицы не создавались, будут утеряны.

Пока ничего другого предположить не могу, думаю, вы можете по логам оценить - какие строки не попали. Действительно ли "последние".
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34351863
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что если создать и заполнить только одну таблицу - будет все хорошо...
Возможно дело и в коммите, только пока не могу разобраться почему именно так :)
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34351869
Фотография raidan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безобразный код :)
Делайте commit.
Все исключения отправляйте наверх (чтобы не проглатывались, если что).
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352089
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raidanБезобразный код :)
Делайте commit.
Все исключения отправляйте наверх (чтобы не проглатывались, если что).

А в чем собственно безобразность то заключается? :)
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352096
Фотография raidan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima11
А в чем собственно безобразность то заключается? :)
Вот в этом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
queryStmt.setString( 1 , ((String[])d[ 0 ].getArList().get( 0 ))[i]);
queryStmt.setString( 2 , ((String[])d[ 1 ].getArList().get(i))[j]);
queryStmt.setString( 3 , ((String[])d[ 2 ].getArList().get(j + shift10))[k]);
queryStmt.setString( 4 , ((String[])d[ 3 ].getArList().get(k + shift8))[l]);
queryStmt.setString( 5 , ((String[])d[ 4 ].getArList().get(l + shift6))[m]);
queryStmt.setString( 6 , ((String[])d[ 5 ].getArList().get(m + shift4))[n]);
queryStmt.setString( 7 , ((String[])d[ 6 ].getArList().get(n + shift2))[o]);

И еще в
Код: plaintext
to_date(?, 'dd.mm.yyyy hh24:mi:ss')
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352102
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
Oracle поддерживает асинхронные DML в рамках одной транзакции???????????????????
надо об этом написать в службу техподдержки и поблагодарить их выпить за такой подарок...
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352104
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
zOracle поддерживает асинхронные DML в рамках одной транзакции???????????????????
надо об этом написать в службу техподдержки и поблагодарить их выпить за такой подарок...
ну в смысле и выпить тоже
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352161
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raidan Dima11
А в чем собственно безобразность то заключается? :)
Вот в этом.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
queryStmt.setString( 1 , ((String[])d[ 0 ].getArList().get( 0 ))[i]);
queryStmt.setString( 2 , ((String[])d[ 1 ].getArList().get(i))[j]);
queryStmt.setString( 3 , ((String[])d[ 2 ].getArList().get(j + shift10))[k]);
queryStmt.setString( 4 , ((String[])d[ 3 ].getArList().get(k + shift8))[l]);
queryStmt.setString( 5 , ((String[])d[ 4 ].getArList().get(l + shift6))[m]);
queryStmt.setString( 6 , ((String[])d[ 5 ].getArList().get(m + shift4))[n]);
queryStmt.setString( 7 , ((String[])d[ 6 ].getArList().get(n + shift2))[o]);

И еще в
Код: plaintext
to_date(?, 'dd.mm.yyyy hh24:mi:ss')


А примерчик "красивого" написания данного кода можно? :) учусь... :)
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352275
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :)
А вот на счет вот этого:
zOracle поддерживает асинхронные DML в рамках одной транзакции???????????????????

не знал... Как я понял все дело было именно в этом. Можно об этом в двух словах или ссылку, плиз.
Большое спасибо за помощь.
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352282
qqwerr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima11Коннекшен к ораклу один на все потоки
Так делать не рекомендуется. Коммит в одном потоке = коммит для всех.
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352368
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
Dima11И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :)
А вот на счет вот этого:
zOracle поддерживает асинхронные DML в рамках одной транзакции???????????????????

не знал... Как я понял все дело было именно в этом. Можно об этом в двух словах или ссылку, плиз.
Большое спасибо за помощь.

ну если в двух словах - то нет такого, и быть не может. На то она и транзакция
То есть реально у тебя каждый поток ждет пока не выполнится предыдущий insert...
Надо открывать несколько Connection'ов
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352635
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное надо сделать пул коннекшенов, статейку как раз про это читаю с lib.juga.ru ?
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34352734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima11...

1) Есть подозрение, что вы неправильно работаете с параллелизмом в Java. Возможно вы действительно создаёте несколько потоков, но объекты JDBC (Connection, Statement) у вас чудесным образом пересекаются, что и вызывает несогласованность DML операций в базе.

Для того, чтобы говорить на эту тему более детально, надо взглянуть на более самодостаточный исходник.

2) Во время загрузки попросите местного Оракл-ДБА понаблюдать за представлением v$session.
Если всё правильно, то каждому Java-потоку должен соответствовать один Oracle-SID.

3) Я не уверен, но мне кажется, что не стоит так часто закрывать оператор командой close. По крайней мере, когда я создавал бизнес-логику загрузки данных, мне достаточно было сделать следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
queryStmt.setString( 7 , ((String[])d[ 6 ].getArList().get(n + shift2))[o]);
queryStmt.executeUpdate();
......
queryStmt.setString( 7 , ((String[])d[ 6 ].getArList().get(n + shift2))[o]);
queryStmt.executeUpdate();
queryStmt.commit();

Количество update-ов на 1 коммит в идеале должно определятся только бизнес-правилами (об этом пишет Том Кайт). На практике-же этот параметр вы должны уточнить у Оракл-ДБА. В противном случае, можете получите от него по голове за слишком длинные транзакции.

PreparedStatement тоже не стоит создавать мнократно. Судя по формату данных - это синглтон на каждую таблицу.
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34353114
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima11И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :)
Мама моя дорогая. Не надо так делать.... Вы делаете Ораклу больно.
Нет, конечно он не умрет, но это не рекомендуется.
...
Рейтинг: 0 / 0
Многопоточность и INSERT в Oracle
    #34353217
DIMA11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После написания класса являющегося пулом коннектов и выдачи каждому потоку отдельного подключения, надобность в частых коммитах отпала сама собой. И коммит был перенесен обратно - в конец метода. Надеюсь что теперь Ораклу не будет больно :)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность и INSERT в Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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