|
|
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Привет! Имеется несколько потоков создающие несколько экземпляров класса. Один из методов этого класса производит инсерт в таблицу Оракла. Таблицы создаются автоматически, т.е. имена таблиц уникальны для различных потоков. Коннекшен к ораклу один на все потоки. Инсерт производится так, имена таблиц меняются и все это в цикле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Проблема в том, что когда метод с инсертом выполняется различними потоками в одно время, некоторые строки в таблицы просто не попадают. Хотя читая лог файл, вижу что на инсерт посылаются все строки. Хоть экземпляры объектов и различны для разных потоков, но на всякий случай объявлял метод как synchronized. Все равно не помогло... Т.е. в процессы выполнения часть строк не инсертится и ошибки не возникает... Если методы выполняются не в одно время - все ОК. Помогите советом, плиз!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 12:18:31 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
1. Расскажите ораклистам, что вы налету создаете таблицы, и вам расскажут, что они про вас думают. Но это не в тему. 2. Есть подозрение, что вы не выполняете коммит (commit). 3. Вы спросите - а как же попадают другие строки? Дело в том, что создание таблицы это DDL операция, а она выполняет автокоммит. Следовательно, все, что было заинсерчено ранее - коммитится, а все строки, которые добавлялись, и после них В ЭТОЙ СЕССИИ таблицы не создавались, будут утеряны. Пока ничего другого предположить не могу, думаю, вы можете по логам оценить - какие строки не попали. Действительно ли "последние". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 12:52:44 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Дело в том, что если создать и заполнить только одну таблицу - будет все хорошо... Возможно дело и в коммите, только пока не могу разобраться почему именно так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 13:08:43 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Безобразный код :) Делайте commit. Все исключения отправляйте наверх (чтобы не проглатывались, если что). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 13:10:52 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
raidanБезобразный код :) Делайте commit. Все исключения отправляйте наверх (чтобы не проглатывались, если что). А в чем собственно безобразность то заключается? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 15:59:13 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Dima11 А в чем собственно безобразность то заключается? :) Вот в этом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. И еще в Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 16:05:40 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Oracle поддерживает асинхронные DML в рамках одной транзакции??????????????????? надо об этом написать в службу техподдержки и поблагодарить их выпить за такой подарок... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 16:08:33 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
zOracle поддерживает асинхронные DML в рамках одной транзакции??????????????????? надо об этом написать в службу техподдержки и поблагодарить их выпить за такой подарок... ну в смысле и выпить тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 16:09:22 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
raidan Dima11 А в чем собственно безобразность то заключается? :) Вот в этом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. И еще в Код: plaintext А примерчик "красивого" написания данного кода можно? :) учусь... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 16:52:28 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :) А вот на счет вот этого: zOracle поддерживает асинхронные DML в рамках одной транзакции??????????????????? не знал... Как я понял все дело было именно в этом. Можно об этом в двух словах или ссылку, плиз. Большое спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 18:27:36 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Dima11Коннекшен к ораклу один на все потоки Так делать не рекомендуется. Коммит в одном потоке = коммит для всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 18:40:50 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Dima11И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :) А вот на счет вот этого: zOracle поддерживает асинхронные DML в рамках одной транзакции??????????????????? не знал... Как я понял все дело было именно в этом. Можно об этом в двух словах или ссылку, плиз. Большое спасибо за помощь. ну если в двух словах - то нет такого, и быть не может. На то она и транзакция То есть реально у тебя каждый поток ждет пока не выполнится предыдущий insert... Надо открывать несколько Connection'ов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 20:33:36 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
наверное надо сделать пул коннекшенов, статейку как раз про это читаю с lib.juga.ru ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 10:43:52 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Dima11... 1) Есть подозрение, что вы неправильно работаете с параллелизмом в Java. Возможно вы действительно создаёте несколько потоков, но объекты JDBC (Connection, Statement) у вас чудесным образом пересекаются, что и вызывает несогласованность DML операций в базе. Для того, чтобы говорить на эту тему более детально, надо взглянуть на более самодостаточный исходник. 2) Во время загрузки попросите местного Оракл-ДБА понаблюдать за представлением v$session. Если всё правильно, то каждому Java-потоку должен соответствовать один Oracle-SID. 3) Я не уверен, но мне кажется, что не стоит так часто закрывать оператор командой close. По крайней мере, когда я создавал бизнес-логику загрузки данных, мне достаточно было сделать следующее: Код: plaintext 1. 2. 3. 4. 5. 6. Количество update-ов на 1 коммит в идеале должно определятся только бизнес-правилами (об этом пишет Том Кайт). На практике-же этот параметр вы должны уточнить у Оракл-ДБА. В противном случае, можете получите от него по голове за слишком длинные транзакции. PreparedStatement тоже не стоит создавать мнократно. Судя по формату данных - это синглтон на каждую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 14:15:48 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
Dima11И действительно дело в комите! Раньше он выполнялся в конце метода, а после его установки после инсерта каждой строки проблемы исчезли :) Мама моя дорогая. Не надо так делать.... Вы делаете Ораклу больно. Нет, конечно он не умрет, но это не рекомендуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 22:39:35 |
|
||
|
Многопоточность и INSERT в Oracle
|
|||
|---|---|---|---|
|
#18+
После написания класса являющегося пулом коннектов и выдачи каждому потоку отдельного подключения, надобность в частых коммитах отпала сама собой. И коммит был перенесен обратно - в конец метода. Надеюсь что теперь Ораклу не будет больно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2007, 08:21:14 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34352104&tid=2146552]: |
0ms |
get settings: |
16ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
60ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 314ms |
| total: | 539ms |

| 0 / 0 |
