Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Многопоточность и INSERT в Oracle


Автор: Enterprise 23.2.2007, 12:36
Привет!
Имеется несколько потоков создающие несколько экземпляров класса. Один из методов этого класса производит инсерт в таблицу Оракла. Таблицы создаются автоматически, т.е. имена таблиц уникальны для различных потоков. Коннекшен к ораклу один на все потоки. Инсерт производится так, имена таблиц меняются и все это в цикле:

[SRC java]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(); [/SRC]

Проблема в том, что когда метод с инсертом выполняется различними потоками в одно время, некоторые строки в таблицы просто не попадают. Хотя читая лог файл, вижу что на инсерт посылаются все строки. Хоть экземпляры объектов и различны для разных потоков, но на всякий случай объявлял метод как synchronized. Все равно не помогло... Т.е. в процессы выполнения часть строк не инсертится и ошибки не возникает... Если методы выполняются не в одно время - все ОК.
Помогите советом, плиз!!

Автор: JUncle 23.2.2007, 12:56
Копните в сторону транзакций, мб поможет.

Автор: Enterprise 23.2.2007, 18:32
Проблема была в отсутствии в Oracle поддержки асинхронных DML в рамках одной транзакции. 
Решилась добавлением коммита после инсерта каждой строки smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)