Дополнительные (бесполезные) ROLLBACK'и при использовании BasicDataSource из commons-dbcp

158
14 ноября 2018, 03:30

Если экземпляр BasicDataSource из Apache commons-dbcp (версии 1.4, т. к. я ограничен Java 1.6) сконфигурирован с defaultAutoCommit=false, то библиотека выполняет два бесполезных ROLLBACK'а — один при взятии соединения из пула, и ещё один при возвращении его обратно (т. е. закрытии соединения из пула при сохранении низкоуровневого физического соединения открытым).

Соответствующие стек-трейсы (на примере T4CConnection драйвера Oracle Thin):

T4CConnection(PhysicalConnection).rollback() line: 1950 
PoolableConnection(DelegatingConnection).rollback() line: 368   
PoolableConnectionFactory.passivateObject(Object) line: 685 
BasicDataSource.validateConnectionFactory(PoolableConnectionFactory) line: 1559 
BasicDataSource.createPoolableConnectionFactory(ConnectionFactory, KeyedObjectPoolFactory, AbandonedConfig) line: 1545  
BasicDataSource.createDataSource() line: 1388   
BasicDataSource.getConnection() line: 1044  

и

T4CConnection(PhysicalConnection).rollback() line: 1950 
PoolableConnection(DelegatingConnection).rollback() line: 368   
PoolableConnectionFactory.passivateObject(Object) line: 685 
GenericObjectPool.addObjectToPool(Object, boolean) line: 1379   
GenericObjectPool.returnObject(Object) line: 1342   
PoolableConnection.close() line: 90 
PoolingDataSource$PoolGuardConnectionWrapper.close() line: 191  

Т. обр., каждая успешная транзакция — это последовательность след. вида:

  1. ROLLBACK (взятие соединения)
  2. полезная работа с БД
  3. COMMIT (прикладной код)
  4. ROLLBACK (закрытие соединения)

(вместо единственного COMMIT'а), в то время как каждая неудачная — это:

  1. ROLLBACK (взятие соединения)
  2. полезная работа с БД
  3. ROLLBACK (прикладной код)
  4. ROLLBACK (закрытие соединения)

(вместо единственного ROLLBACK'а).

Вышеописанное поведение даёт дополнительную нагрузку на redo- и undo-подсистемы (что очень хорошо видно под нагрузкой в Oracle, но, на самом деле, при использовании commons-dbcp проблема универсальна — я наблюдал ровно то же самое и для, напр., MySQL).

Вопрос 1: как избавиться от пресловутых ROLLBACK'ов, сохранив экземпляр DataSource сконфигурированным с defaultAutoCommit=false (т. е. без необходимости вручную вызывать setAutoCommit(false) для каждого соединения, взятого из пула)?

Вопрос 2: как можно обойти проблему средствами Oracle (т. е. без необходимости менять прикладной код или библиотеки)?

READ ALSO
vue.js Поиск по элементам

vue.js Поиск по элементам

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

145
Парсинг первого элемента списка в dom

Парсинг первого элемента списка в dom

Есть разметка html на сайте:

178
undefined или ? typescript

undefined или ? typescript

Вопрос больше по красоте кодаКак лучше написать

149