Ошибка StackOverflowError commons-откат dbcp2

#java #hibernate #database-connection #apache-commons-dbcp #apache-commons-io

Вопрос:

Внезапно в одной из сред мы видим следующие повторяющиеся строки dbcp2 и, в конечном счете, ошибку StackOverflow.

В нашем коде вызывается Hibernate (3.6.10) getHibernateSession().getTransaction().откат (). Он использует commons-dbcp2(2.6.0). jdbcdriver-это ojdbc8-12.2.0.1, Oracle 12C, а Java-1.8.

Приведенные ниже строки повторяются более 3000 раз. Я подозреваю какую-то ошибку в dbcp2? почему он зацикливается на собственных методах. Если кто-нибудь из вас сталкивался с подобной проблемой, пожалуйста, поделитесь. Подумываю обновить зависимости до последней версии для hibernate, commons-dbcp2 и commons-io.


             at org.apache.commons.pool2.impl.GenericKeyedObjectPool.toStringAppendFields(GenericKeyedObjectPool.java:1605)
            at org.apache.commons.pool2.BaseObject.toString(BaseObject.java:31)
            at org.apache.commons.dbcp2.PoolingConnection.toString(PoolingConnection.java:606)
            at java.lang.String.valueOf(String.java:3408)
            at java.lang.StringBuilder.append(StringBuilder.java:516)
            at org.apache.commons.pool2.impl.GenericKeyedObjectPool.toStringAppendFields(GenericKeyedObjectPool.java:1605)
            at org.apache.commons.pool2.BaseObject.toString(BaseObject.java:31)
            at org.apache.commons.dbcp2.PoolingConnection.toString(PoolingConnection.java:606)
            at java.lang.String.valueOf(String.java:3408)
            at java.lang.StringBuilder.append(StringBuilder.java:516)
            at org.apache.commons.pool2.impl.GenericKeyedObjectPool.toStringAppendFields(GenericKeyedObjectPool.java:1605)
 

[Обновлено:20210818] Фрагмент кода, который мы используем для отката, как пример ниже:

 this.getHibernateSession().getTransaction().rollback();
this.getHibernateSession().clear();
this.getHibernateSession().getTransaction().begin();
        
 

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

1. Не могли бы вы поделиться своим кодом? Я думаю, что подключение в качестве параметра к функции добавления StringBuffer не является ожидаемым шаблоном….

2. Чтобы дать представление о месте, откуда мы выполняем откат с помощью сеанса гибернации, я написал пример кода и обновил его в этом посте. Точным кодом я не могу поделиться из-за политики.

3. Предполагая, что dbcp использует commons-pool2-2.6.0-sources.jar, похоже, что драйвер пытается преобразовать KeyedPooledObjectFactory в строку, а затем пытается преобразовать KeyedObjectPool в строку, что, возможно, вызывает цикл. Может быть полезно, если вы поделитесь своей конфигурацией БД…

4. Мы обновили базу данных Oracle с 12C до 19C, и она перестала давать проблемы. Хотя я и не смог провести дальнейшее расследование, но теперь, похоже, это решено.