Эта проблема беспокоила меня в течение многих месяцев, я надеюсь, что то, что я придумала, поможет кому-то еще:
Я наконец-то нашел решение своей проблемы.Вместо использования OracleDataSource в качестве фабрики соединений:
<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
Я бы предложил попробовать OracleConnectionPoolDataSource:
<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
OracleConnectionPoolDataSource расширяет OracleDataSource и, кажется, работает лучше в приложениях, где необходимо открыть несколько соединенийнесколькими ресурсами.В моем случае у меня есть приложение, которое требует обработки нескольких пакетных файлов.Один и тот же код SQL запускается снова и снова, но приложению требуется новое соединение для каждого нового файла.При этих обстоятельствах OracleDataSource часто приводил к ошибкам соединения или к каким-либо другим видам (например, SQLException: закрытое соединение, NullPointerException: соединение закрыто с или без UCP), приводило к проблемам с сборкой мусора (долгосрочное GC заполнялось и приводило к отказу GC в конечном итогенезависимо от того, сколько памяти я добавил в JVM).
Я обнаружил, что OracleDataSource хорошо работает с приложениями, которые не используют много пакетной обработки.Например, другое приложение, которое я использую, - это приложение для обработки файлов, но оно работает только с одним файлом за раз.OracleDataSource прекрасно работает в этих условиях.Это также, кажется, работает хорошо для веб-приложений.У нас есть веб-приложение, которое мы установили OracleDataSource 9 месяцев назад, и у него не было проблем.
Я уверен, что есть способы заставить работать OracleDataSource так же, как и OracleConnectionPoolDataSource, но это работает для меня.