При использовании неявного кэша операторов (или расширения Oracle для явного кэша операторов) драйвер Oracle будет кэшировать подготовленный или вызываемый оператор после (!) Закрытия () для повторного использования с физическим соединением.
Итак, что происходит: если используется подготовленный оператор, а физическое соединение его никогда не видело, он отправляет SQL в БД. В зависимости от того, видел ли БД оператор ранее или нет, он выполнит жесткий или мягкий анализ. Поэтому, как правило, если у вас есть 10 пулов соединений, вы увидите 10 разборов, один из которых - жесткий разбор.
После закрытия оператора в соединении драйвер Oracle поместит дескриптор проанализированного оператора (общий курсор) в кэш LRU. В следующий раз, когда вы будете использовать prepareStatement для этого соединения, он найдет этот кэшированный дескриптор для использования и ему вообще не нужно отправлять SQL. Это приводит к выполнению без PARSE.
Если в физическом соединении используется больше (разных) подготовленных операторов, чем размер кэша, самый длинный неиспользуемый открытый совместно используемый курсор закрывается. Это приводит к другому мягкому анализу в следующий раз, когда оператор снова используется - потому что SQL нужно снова отправить на сервер.
Это в основном та же функция, что и некоторые источники данных для промежуточного программного обеспечения, реализованные более обобщенно (например, кэш подготовленных операторов в JBoss). Используйте только один из них, чтобы избежать двойного кэширования.
Подробности вы можете найти здесь:
http://docs.oracle.com/cd/E11882_01/java.112/e16548/stmtcach.htm#g1079466
Также ознакомьтесь с Oracle Unified Connection Pool (UCP), который поддерживает это и взаимодействует с FAN.