Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JDBC транзакции, вопросы про connection и commit 
:(
    Опции темы
SectoR
Дата 13.11.2010, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Весь код приводить не буду слишком емкий... Опишу так:

В главном методе создается соединение 
Код

conn = DriverManager.getConnection(...


далее вызывается метод fillPerson(Connection conn, List persons)

в нем происходит заполнение таблиц ПЕРСОНЫ

после чего все это завершается так:
CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off

Код

 conn.commit();
      if(rs!=null)  rs.close();
      if(st!=null)  st.close();




далее вызывается метод fillDocs(Connection conn, List persons)

в нем происходит заполнение таблицы ДОКУМЕНТЫ связанной с таблицей ПЕРСОНЫ (ДОКУМЕНТЫ.КОД_ПЕРСОНЫ = ПЕРСОНЫ.КОД)

после чего все это завершается так:
CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off

Код

      conn.commit();
      if(rs!=null)  rs.close();
      if(st!=null)  st.close();




в результате отработки метода fillPerson все без багов, а вот второй метод никак не хочет отрабатывать
Цитата

Код

java.sql.SQLException: Недопустимый индекс столбца
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5013)
at oracle.jdbc.driver.OracleCallableStatement.setString(OracleCallableStatement.java:4155)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.java:278)
at exceltest.PrivateSectorPersons.DocsInsertion(PrivateSectorPersons.java:548)
at exceltest.PrivateSectorPersons.fillDataBase(PrivateSectorPersons.java:613)
at exceltest.Main.main(Main.java:160)



Я подумал что 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) закрыть соединение

Уважаемые форумчане, просвященные в данном вопросе, подскажите - правильны ли мои доводы? 
PM   Вверх
jk1
Дата 13.11.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Исходя из этого мне нужно сделать так:
1) открыть соединение, с опцией setAutoCommit(false);
2) заполнить таблицу методом fillPerson
3) выполнить команду conn.commit()
4) закрыть соединение

5) открыть соединение, с опцией setAutoCommit(false);
6) заполнить таблицу методом fillDocs
7) выполнить команду conn.commit()
8) закрыть соединение

Я бы предложил поменять порядок:

1. Открыть соединение
2. Вызвать у него метод setAutoCommit(false);
3. заполнить таблицу методом fillPerson
4. выполнить команду conn.commit()
5. заполнить таблицу методом fillDocs
6. выполнить команду conn.commit()
7. Соединение сохранить и использовать в будущем.

Если речь идет о серверном коде, то там часто удобно использовать connection pool.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
SectoR
Дата 13.11.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



спсб вопрос решен! оказалось нужно использовать PreparedStatement вместо CallableStatement (он используется при работе с процедурами и функциями)
и в данном случае, нумеруются "вопросительные знаки" (нумерация начинается с единицы), а не столбцы.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.