| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > JDBC транзакции |
| Автор: SectoR 13.11.2010, 08:11 | ||||||||
| Весь код приводить не буду слишком емкий... Опишу так: В главном методе создается соединение
далее вызывается метод fillPerson(Connection conn, List persons) в нем происходит заполнение таблиц ПЕРСОНЫ после чего все это завершается так: CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off
далее вызывается метод fillDocs(Connection conn, List persons) в нем происходит заполнение таблицы ДОКУМЕНТЫ связанной с таблицей ПЕРСОНЫ (ДОКУМЕНТЫ.КОД_ПЕРСОНЫ = ПЕРСОНЫ.КОД) после чего все это завершается так: CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off
в результате отработки метода fillPerson все без багов, а вот второй метод никак не хочет отрабатывать Цитата
Я подумал что commit не активируется после добавления записей в первую таблицу (ПЕРСОНЫ) и поэтому не происходит вставка во вторую таблицу (ДОКУМЕНТЫ, связанную с первой). Затем до вызова методов fillPerson и fillDocs я добавил conn.setAutoCommit(false); т.к. прочитал в документации что conn.commit() будет срабатывать только тогда, когда auto-commit опция будет отключена. И по умолчанию все объекты Connection находятся в режиме автозавершения. Но и это не помогло!!! Я так понимаю: commit делает постоянными изменения, произведенные командами, связанными с соединением?! Исходя из этого мне нужно сделать так: 1) открыть соединение, с опцией setAutoCommit(false); 2) заполнить таблицу методом fillPerson 3) выполнить команду conn.commit() 4) закрыть соединение 5) открыть соединение, с опцией setAutoCommit(false); 6) заполнить таблицу методом fillDocs 7) выполнить команду conn.commit() 8) закрыть соединение Уважаемые форумчане, просвященные в данном вопросе, подскажите - правильны ли мои доводы? |
| Автор: jk1 13.11.2010, 10:00 | ||
Я бы предложил поменять порядок: 1. Открыть соединение 2. Вызвать у него метод setAutoCommit(false); 3. заполнить таблицу методом fillPerson 4. выполнить команду conn.commit() 5. заполнить таблицу методом fillDocs 6. выполнить команду conn.commit() 7. Соединение сохранить и использовать в будущем. Если речь идет о серверном коде, то там часто удобно использовать http://en.wikipedia.org/wiki/Connection_pool. |
| Автор: SectoR 13.11.2010, 11:47 |
| спсб вопрос решен! оказалось нужно использовать PreparedStatement вместо CallableStatement (он используется при работе с процедурами и функциями) и в данном случае, нумеруются "вопросительные знаки" (нумерация начинается с единицы), а не столбцы. |