oracle.jdbc.autoCommitSpecCompliant ПРОТИВ setAutoCommit(ложь)

#java #jdbc #commit #oracle19c #autocommit

Вопрос:

У нас есть устаревшее приложение, использующее обычный JDBC для подключения к базе данных Oracle. Недавно эта база данных была обновлена до Oracle 19c.

Для этого мы сейчас используем нижеприведенную зависимость.

 <dependency>
    <groupId>com.oracle.ojdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version>
</dependency>
 

После обновления приложение начало выдавать ошибки по очевидным причинам, таким как Результат, не закрытый до вызова, во время отката() и т.д.

Я нашел ниже два подхода, которые работают.

 System.setProperty ("oracle.jdbc.autoCommitSpecCompliant", "false"); 
 

или

 connection.setAutoCommit(false);
 

Я хочу знать, в чем разница между двумя вышеперечисленными решениями и какое из них лучше.

Ссылка для ссылки —
https://docs.oracle.com/en/database/oracle/oracle-database/21/jajdb/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTO_COMMIT_SPEC_COMPLIANT

Комментарии:

1. Я не специалист в этом, но от прочтения указанной ссылке я бы сказал, что вы должны использовать setAutoCommit(false) что «пользователям предлагается модифицировать свои приложения для поддержки спецификации вместо того, чтобы использовать этот флаг.» — Насколько я понимаю, заключается в том, что если вы установите флаг в false, водитель не будет бросать исключение, если вы вызываете rollback() на подключение, использующее автоматической фиксации и т. д. и я сомневаюсь, что это то, что вы хотите (т. е. водитель молчать о возможных ошибках).

2. Если вы используете setAutoCommit(false) , вы также должны изменить свое приложение на явный вызов commit() или rollback() , где это уместно. Эти два варианта не эквивалентны, хотя лично я бы изменил свое приложение, чтобы оно работало с заданным поведением JDBC.

Ответ №1:

Из документации, на которую вы ссылались, изменение oracle.jdbc.autoCommitSpecCompliant :

Изменяет поведение автоматической фиксации драйвера. По умолчанию драйвер соответствует спецификации JDBC. Пользователь может изменить поведение, изменив значение этого флага.

В то время как connection.setAutoCommit(false); :

Устанавливает режим автоматической фиксации этого соединения в заданное состояние.

Этот последующий вызов изменяет только состояние автоматической фиксации одного соединения и не изменяет состояние автоматической фиксации других соединений; первый изменяет поведение автоматической фиксации по умолчанию для всех будущих соединений.

Какой из них лучше.

Ни то, ни другое, у них разные варианты использования, и вы должны использовать то, что наиболее подходит для вашего варианта использования.

Если у вас есть несколько подключений, все из которых не должны автоматически фиксироваться в качестве поведения по умолчанию, вы можете установить это значение в драйвере. (Не делайте этого, если у вас есть соединения с несколькими состояниями автоматической фиксации, особенно если некоторые приложения полагаются на состояние по умолчанию, когда автоматическая фиксация верна.)

Если вы хотите обрабатывать соединения по отдельности, установите состояние для каждого соединения.