Настройка и обновление свойств пула соединений (OracleConnectionPoolDataSource) для лучшей производительности

в веб-приложении Java, над которым я работаю, мы используем OracleConnectionPoolDataSource для функциональности пула соединений с базой данных. Каждый вызов getConnection включает идентификатор Oracle пользователя и пароль. Таким образом, каждый пользователь в некотором смысле получает собственный пул подключений к базе данных.

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

  • MinLimit значение 0
  • maxlimit на набор в Целое число.Массив
  • MaxStatementsLimit значение 0
  • InactivityTimeout значение 0
  • TimeToLiveTimeout значение 0
  • AbandonedConnectionTimeout значение 0
  • PropertyCheckInterval установить на 900
  • ConnectionWaitTimeout значение 0

подробнее об этих свойствах можно найти в подключение Свойства Кэша.

в настоящее время у нас нет никаких проблем с подключением к базе данных, но думаю, что производительность может быть лучше. Мой вопрос в том, есть ли у кого-то хороший совет или хороший ресурс о том, что мы должны учитывать при настройке этих значений.

3 ответов


руководство по производительности сервера приложений Oracle для версии 3 10g (10.1.3.1) содержит окончательную информацию о Как оптимизировать параметры пула соединений.

информация полезна почти для всех сценариев, связанных с приложением, использующим пул соединений для управления подключениями к базе данных Oracle, не выдерживая сервер приложений в использовании.

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

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

тайм-ауты должны быть выбраны с учетом окружающей среды. Например, соединение время ожидания не должно быть равно нулю в большинстве случаев, так как это может вызвать SQLExceptions, когда физические соединения не могут быть инициализированы в пуле в течение достаточного интервала. Тайм-аут бездействия должен быть достаточно большим, чтобы соединения были удалены только после достаточной продолжительности бездействия; слишком низкое значение приведет к созданию и удалению физических соединений слишком часто.

EDIT: руководство, приведенное в руководстве по производительности, применяется к оракул.интерфейс jdbc.бассейн.Класс OracleDataSource, который сервер приложений Oracle 10g использует для управляемых источников данных в базе данных Oracle. Большая часть этого, безусловно, перейдет к OracleConnectionPoolDataSource.


вы рассматривали возможность использования нового Oracle UCP? Цитата из список функций 11г (выделено мной):

1.4.1.29 универсальный пул соединений (UCP) для JDBC

универсальный пул соединений для JDBC заменяет неявный кэш соединений и предоставляет следующие функции:

  • маркировка соединений, сбор соединений, ведение журнала и статистика
  • производительность и улучшения стабилизации
  • улучшенная диагностика и статистика или показатели

UCP для JDBC обеспечивает расширенные функции объединения соединений, улучшенную производительность и лучшую диагностируемость проблем соединения.


мой первый совет: профиль.

мой второй совет: профиль.

что замедляет ваше приложение, какие вызовы методов вызывают ухудшение производительности вашего приложения?

вы постоянно ждете создания новых соединений? Затем установите MinLimit выше 0, то же самое с "начальным пределом", чтобы у вас было несколько доступных для запуска. Если вы хотите, чтобы ваш MaxLimit был бесконечностью, установите его в '0', параметр 0 указывает нет предел.

вы создаете новые соединения, когда на самом деле вы должны использовать существующее, но неактивное соединение? Установить InactivityTimeout что-то кроме 0. То же самое касается AbandonedConnectionTimeout.

обратите внимание, первое, с чем я бы возился, было бы "начальным пределом" -

от Oracle о начальном пределе

Это устанавливает размер соединения кэш, когда кэш изначально создания или инициализации. Когда это свойство имеет значение больше чем 0, что многие соединения предварительно созданы и готовы к использованию. Это свойство обычно используется для уменьшить "нарастить" в грунт кэш до оптимального размера.