2009-09-23 2 views
7

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

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

  • MinLimit установлен в 0
  • MaxLimit набор для Integer.MAX_VALUE
  • MaxStatementsLimit установлен в 0
  • InactivityTimeout набор до 0
  • TimeToLiveTimeout набор для 0
  • AbandonedConnectionTimeout набор в 0
  • PropertyCheckInterval набор 900
  • ConnectionWaitTimeout набор в 0

Больше информации об этих свойствах можно найти на Connection Cache Properties.

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

ответ

6

Руководство по производительности сервера приложений Oracle для версии 10g Release 3 (10.1.3.1) содержит окончательную информацию о how to optimize the connection pool parameters.

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

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

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

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

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

+0

InactivityTimeout: По истечении срока действия InactivityTimeout основное физическое соединение закрывается. Тем не менее, размер кеша не разрешается сокращаться ниже minLimit, если он установлен. - Это из документов Oracle и говорит, что minLimit не будет сокращаться, даже если все объекты соединения будут закрыты таймаутом. Означает ли это, что он позволяет устаревшему объекту жить внутри пула? http://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm#CDEBCBJC –

2

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

Мой второй совет: Профиль.

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

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

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

Обратите внимание, первое, что я бы подправлять бы быть «начально-limit'-

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

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

5

Рассматривали ли вы использование нового Oracle UCP? Цитата из 11g feature list (курсив мой):

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

Универсальный пула соединений для JDBC заменяет неявной Cache Connection и обеспечивает следующие функции:

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

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

+2

Мне нравится этот ответ. К сожалению, в настоящее время мы не можем перейти на новые драйверы. – Prof

+1

Вы должны это рассмотреть. IIRC возможности объединения Oracle DataSource устарели в пользу использования UCP. – yawn