Как установить значение autocommit в false при подключении к источнику данных Oracle?

1

Вставка значений в Oracle 11g через JdbcTemplate-OracleDataSource, введенные через конфигурационный файл Spring. Транзакции выполняются с помощью @Transactional, управляемого DataSourceTransactionManager.

Вопрос 1) Как установить значение autocommit равным false? Значение по умолчанию истинно, я думаю. Ниже приведен фрагмент кода:

    DataSource ds = (DataSource)ctx.getBean("dataSourceBean");
    try {
        ds.getConnection().setAutoCommit(false);
        System.out.println("Autocommit " +ds.getConnection().getAutoCommit());
    } catch (SQLException e) {          
        e.printStackTrace();
    }

Утверждение println дает только true.

Также напечатано значение getAutoCommit в методе вставки класса DAO. То же самое происходит.

Question2) Для уникального нарушения ограничений мне нужно откат. В этом случае генерируется исключение DuplicateKeyException которое обертывается над SQLIntegrityConstraintViolationException. Итак, @Transactional (rollbackFor =?.Class) должен иметь, какое исключение?

  • 0
    Задайте только один вопрос за один раз.
  • 0
    Соединение (или его прокси) может вернуть true, потому что фиксация обрабатывается автоматически (контейнером), а не вами.
Теги:

2 ответа

1
Лучший ответ

1. Хранить его в переменной

DataSource ds = (DataSource)ctx.getBean("dataSourceBean");
try {
    Connection con =ds.getConnection();
    con.setAutoCommit(false);
    System.out.println("Autocommit " +con.getAutoCommit());
} catch (SQLException e) {          
    e.printStackTrace();
}

Когда вы снова вызываете ds.getConnection(), вы получаете другое соединение из пула

2.Изменить конфигурацию Weblogic DataSource
Автоматическое совершение транзакций, если явно не выполнено или отката

  • 0
    @ Махди Да, это то, что я узнал только сейчас. Есть ли способ установить автокоммит в самом весеннем конфиге? Используем так: <bean id = "dataSourceBean" class = "oracle.jdbc.pool.OracleDataSource"> <имя свойства = "databaseName" value = "xx" /> <имя свойства = "URL" value = "xx" / > <property name = "user" value = "xx" /> <property name = "password" value = "xx" /> </ bean>
  • 0
    <property name = "defaultAutoCommit"> <value> false </ value> </ property>
Показать ещё 1 комментарий
1

Вместо того, чтобы делать программно, проверьте, что пул соединений имеет возможность установить auto commit в false при возврате соединения из пула. DBCP BasicDataSource имеет такую опцию

Spring будет откатываться, если будет выбрано любое RuntimeException.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню