#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);
:
Устанавливает режим автоматической фиксации этого соединения в заданное состояние.
Этот последующий вызов изменяет только состояние автоматической фиксации одного соединения и не изменяет состояние автоматической фиксации других соединений; первый изменяет поведение автоматической фиксации по умолчанию для всех будущих соединений.
Какой из них лучше.
Ни то, ни другое, у них разные варианты использования, и вы должны использовать то, что наиболее подходит для вашего варианта использования.
Если у вас есть несколько подключений, все из которых не должны автоматически фиксироваться в качестве поведения по умолчанию, вы можете установить это значение в драйвере. (Не делайте этого, если у вас есть соединения с несколькими состояниями автоматической фиксации, особенно если некоторые приложения полагаются на состояние по умолчанию, когда автоматическая фиксация верна.)
Если вы хотите обрабатывать соединения по отдельности, установите состояние для каждого соединения.