Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > JDBC транзакции


Автор: SectoR 13.11.2010, 08:11
Весь код приводить не буду слишком емкий... Опишу так:

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

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) закрыть соединение

Уважаемые форумчане, просвященные в данном вопросе, подскажите - правильны ли мои доводы? 

Автор: jk1 13.11.2010, 10:00
Цитата

Исходя из этого мне нужно сделать так:
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. Соединение сохранить и использовать в будущем.

Если речь идет о серверном коде, то там часто удобно использовать http://en.wikipedia.org/wiki/Connection_pool.

Автор: SectoR 13.11.2010, 11:47
спсб вопрос решен! оказалось нужно использовать PreparedStatement вместо CallableStatement (он используется при работе с процедурами и функциями)
и в данном случае, нумеруются "вопросительные знаки" (нумерация начинается с единицы), а не столбцы.

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