2008-11-07 2 views
10

Каков наилучший способ настройки вашего бассейна относительно: -Как настроить пул соединений?

  1. Когда вы создаете соединения?
  2. Когда вы закрываете соединения и закрываете ли вы все из них?
  3. Вы проверяете соединения по-прежнему хорошо. Когда и как?
  4. Как вы узнали о хорошем количестве для максимального количества соединений?
  5. Какого рода мониторинг у вас есть, чтобы пользователи пула хорошо себя вели? Можете ли вы остановить один плохой фрагмент кода, чтобы вытащить все?
  6. Вы написали свой собственный пул или использовали стороннюю библиотеку?

Я считаю, что это агностический вопрос, но комментарии по поводу «особенностей» конкретных баз данных/языков приветствуются. Например, может быть медленнее или дороже подключаться к некоторым базам данных, чем к другим.

Чтобы уточнить, я не собираюсь писать пул с нуля, этот вопрос связан с настройкой существующей библиотеки, которая объединяет.

ответ

6

Я написал пул соединений для базы данных в Java, когда это был всего лишь шаблон проектирования, а не общая библиотека. Теперь я использую тот, который встроен в Tomcat.

Я использовал нить контролировать несколько аспектов бассейна и несколько параметров для управления его поведением ...

  1. minimumInPool = «3» ... Эти первые три созданы при запуске. Бассейн никогда не может опускаться ниже трех.
  2. maximumIdleTimeBeforeRemoval = "60" ... Если соединение простаивает в течение часа, отбросьте его и создайте новый. Время простоя, вероятно, означает, что в пуле есть только минимум три.
  3. maximumInUseTimeBeforeRemoval = "30" ... Если данное соединение было проверено на протяжении более 30 минут, возможно, что-то не так. Вспомните его и убейте соединение.
  4. maximumTimeBeforeRemoval = "60" ... Удалите его, если ему больше 60 минут.
  5. maximumUsageBeforeRemoval = "1000" ... Удалите его, если он был извлечен более 1000 раз.
  6. monitorInterval = "15" ... Проверьте указанные параметры каждые 15 минут.

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

Я использовал тонкие драйверы Oracle JDBC и подключился к базе данных Oracle.

1

Зачем изобретать колесо?

Кто-то уже, вероятно, решил проблему, и лучше.

Если вы находитесь в мире Java, вы можете использовать Commons DBCP.

3

Вот обоснование, которое я использовал для недавней реализации.

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

  2. У вас есть пул соединений, поддерживающих небольшое количество готовых соединений, минимум N и максимум M. N можно настроить в зависимости от максимальной скорости, с которой ваши клиенты запрашивают соединения. Если количество готовых подключений когда-либо падает до нуля, вам нужно больше N. Если число постоянно высокое (скажем, выше 10), вам нужно меньше N.

  3. Когда клиент хочет подключения, дайте им один из готовых (что делает его активным), а затем сразу же открыть новый, если в настоящее время меньше, чем N готово (но не заставляйте клиента ждать, пока он завершится, или вы потеряете преимущество объединения). Это гарантирует, что всегда будет установлено не менее N готовых подключений. Если ни один из них не готов, когда клиент хочет его, ему придется подождать, пока вы создадите новый.

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

  5. Периодически перерабатывайте готовые соединения для предотвращения устаревших соединений. Если есть более N готовых подключений, просто закройте самое старое соединение. В противном случае закройте его и снова откройте.

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

2

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

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

Прежде чем я отвечу на вопрос об открытии и закрытии соединения, позвольте мне сказать, что кеширование действительно важно. Получение объекта из кеша позволит вам сэкономить массу времени. В некоторых моих приложениях asp.net, когда кеширование включено в dev, я обнаружил, что я едва могу измерить задержку, тогда как при вызове БД может потребоваться от 15 мс до 45 мс для завершения вызова, и это даже не рассмотрение другой задержки факторов или нагрузки. Другой метод, который я использую, является хорошей структурой объектов для моих данных, поэтому я только делаю обновление БД, если что-то меняется. Я реализовал некоторые методы на своем объекте o убедитесь, что я делаю как можно меньше IO.

Это, как говорится, мы все знаем, что нам нужно, чтобы получить доступ и писать в нашу БД в какой-то момент, так что я следовать двум принципам:

  1. держать двери и окна закрытыми, чтобы сэкономить на энергии. Открытое соединение в одном месте означает, что оно недоступно в другом (или память и другие ресурсы более ограничены).Мы превратили пул, потому что это привело к повышению производительности для нас.

  2. Я делаю так много в партии или сразу, как только могу, когда соединение открыто. Это немного сложнее, поэтому позвольте мне объяснить.

    • Один из методов, который я использовал, заключается в передаче объектов соединения по трубе, чтобы все объекты могли использовать один объект соединения. Это приводит к тому, что одно соединение открыто и закрыто, а не 10 или более, в зависимости от вашего приложения. Хорошим примером этого является одна из наших моделей покупки, которая использует возможности SQL-сервера для сбора статистики и хеширования сложных шаблонов заказов. Не имеет смысла продолжать открывать и закрывать соединение, когда вы делаете поиск 200K + DB или независимо от приложений. Другая часть этого заключается в том, что когда я использую объект, я пытаюсь связать свои обновления, чтобы сократить время, в течение которого я держу соединение открытым. Таким образом, делая scope_identity в вызове вставки, позвольте мне позаботиться о моей вставке и поиске уникального идентификатора для добавления к моему объекту до его кеширования. В тот день, когда я впервые разрабатывал приложения asp, я действительно открыл соединение, как только страница начала загружаться, а затем закрыла его. Я больше не рекомендую это делать. Теперь в день есть большая выгода для этих видов абстракций и слоев, которые я бы рекомендовал любому начинающему программисту обратить пристальное внимание.

Мои два цента:

кэша данных! Кэш ваших данных! Кэш ваших данных! Сделайте как можно меньше доступа к БД, если вы не можете кэшировать и затем кэшировать свои данные!

2

Jakarta Commons ДБХП уже делает все вещи, которые вы перечислили:

  • это создает связи по мере необходимости и управляет ими в пуле
  • может закрыть соединение, если они не были использованы в течение определенного периода времени
  • он может выполнить запрос по соединению, прежде чем передать его, и если есть ошибка, соединение будет выброшено и будет создан новый. Соединения также могут периодически проверяться в режиме ожидания.
  • вы можете установить лимит на соединения, которые будут созданы, а также на минимальное количество подключений, которые будут готовы. Предел, конечно, сильно зависит от вашего приложения.
  • Я не знаю, как только DBCP знает, когда соединение не закрывается и закрывает его для вас, генерируя исключение, чтобы вы знали, что произошло, когда вы видите свой журнал.
  • DBCP имеет параметр таймаута, который очень полезен. Если все соединения в пуле используются, он будет ждать этого периода времени, когда соединение будет возвращено в пул, и если в момент достижения предела не будет доступного, вы получите сообщение об ошибке.

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

2

Я согласен с матом b, что мы не должны изобретать велосипед.

Однако использование Commons DBCP может быть основано на ответах this и this вопросов. Здесь есть лучшие альтернативы, такие как c3po или proxool.

Или вы можете использовать rdbms-зависимый механизм объединения соединений.

Смежные вопросы