Создание пула соединения с базой данных

Я использую таблицы в двух случаях:

1) Табличные данные

2) Любое время я хочу, чтобы мое расположение динамично измерило себя к своему содержанию

7
задан Sachin Chourasiya 10 November 2009 в 10:42
поделиться

6 ответов

На вступительной странице Apache DBCP все хорошо резюмируется:

Создание нового соединения для каждого пользователь может занимать много времени (часто требуется несколько секунд часов время), чтобы создать базу данных сделка, которая может принять миллисекунды. Открытие соединения на пользователь может быть неосуществимым в общедоступное Интернет-приложение где количество одновременных пользователей может быть очень большим. Соответственно, разработчики часто хотят поделиться «пул» открытых связей между всеми текущих пользователей приложения. Фактическое количество пользователей выполнение запроса в любой момент времени обычно очень небольшой процент общее количество активных пользователей, и во время обработки запроса - единственный время, когда соединение с базой данных обязательный. Само приложение логирует в СУБД и обрабатывает любого пользователя проблемы с аккаунтом внутри.

Насколько они эффективны? Зависит от реализации. Обычно я ожидаю, что пул будет создавать экземпляры соединений при запуске или по запросу. Первое соединение потребует реального соединения с базой данных, а после этого, когда вы запрашиваете соединение, вам предоставляется существующее объединенное соединение. Таким образом, первый запрос на подключение займет больше всего времени, а потом вы просто извлекаете объекты из коллекции (очень быстро).

3
ответ дан 6 December 2019 в 19:38
поделиться

Ваш вопрос немного двусмысленен:

Do вы хотите вырастить пул соединений? Если так, то это хорошая отправная точка: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html Но это крайне не рекомендуется для производственной среды. Лучше использовать существующий и тщательно протестированный API пула соединений, например DBCP или C3P0 .

Или вы хотите узнать, как использовать пул соединений? Если да, то ответ зависит от API пула соединений, который вы используете. К счастью, он обычно доступен на веб-сайте соответствующего API.

Или вы хотите знать , когда / зачем использовать пул соединений? Если это так, это наверняка повысит производительность подключения, если у вас есть долгоживущее приложение (например, веб-приложение), и вам нужно подключать базу данных чаще, чем часто. Обычная практика JDBC: получить и закрыть Connection , Statement и ResultSet в самом коротком возможном область видимости (т.е. внутри того же самого блока метода). Поскольку подключение довольно дорогое и может занять до 200 мс или даже больше, использование пула подключений происходит намного быстрее. Он предоставляет соединения по запросу и заботится о фактическом закрытии соединения. Однако это не означает, что вы можете изменить способ написания JDBC, вам по-прежнему необходимо приобрести и закрыть их в максимально возможной степени. Единственное, что вам нужно изменить, - это способ установления связи. Например, изменение с

connection = driverManager.getConnection();

на

connection = connectionPool.getConnection();

Больше никаких изменений не требуется, если ваш код JDBC хорошо написан.

6
ответ дан 6 December 2019 в 19:38
поделиться

Создание подключений к базам данных - очень дорогостоящая операция. Пулы соединений - это экземпляры соединений с базой данных, которые создаются и кэшируются. Каждый раз, когда требуется новое соединение с базой данных, вместо создания нового соединения используется соединение из пула. Некоторые платформы, такие как .NET + SQL Server, по умолчанию используют пулы соединений (вам не нужно создавать свои собственные). Таким образом, они в основном повышают производительность, экономя время на создание новых подключений каждый раз.

1
ответ дан 6 December 2019 в 19:38
поделиться

Используя пул подключений, вы экономите время каждый доступ, потому что соединение уже установлено.

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

(см. PreparedStatement, если вы используете Java / JDBC)

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

1
ответ дан 6 December 2019 в 19:38
поделиться

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

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

Некоторые базы данных имеют гораздо большие накладные расходы на подключение, чем другие; если настроен правильно, mysql должен иметь очень мало (сверх времени, чтобы установить TCP-соединение и выполнить квитирование протокола). Однако, если задержка для вашего сервера очень велика, даже это может быть весьма значительным (особенно, если вы собираетесь выполнить только несколько запросов).

Если вы планируете выполнить, скажем, 100 запросов или несколько действительно медленные запросы, то время соединения теряет значение.

Обычно я ' Я каждый раз предлагаю открывать новое соединение, пока вы не продемонстрируете, что это реальная проблема с производительностью. Использование пула соединений может привести к ОШИБКАМ, которые нам не нравятся:

  • Состояние соединения не было ПОЛНОСТЬЮ сброшено после предыдущего использования в пуле - поэтому некоторое состояние задерживается и создает неожиданное поведение, приводящее к ошибке
  • Соединение было каким-то образом закрыто (возможно, по таймауту брандмауэра с отслеживанием состояния), которое не может быть обнаружено, поэтому приложение пытается использовать закрытое соединение, вызывая длительную задержку или сбой
0
ответ дан 6 December 2019 в 19:38
поделиться

Взгляните на BoneCP ( http://jolbox.com ) в разделе тестов для получения некоторых значений. Помните, что подготовленные операторы и т. Д. Привязаны к соединению, поэтому вам нужно будет готовить их снова и снова, если вы сами имеете дело с соединениями (пул соединений будет кэшировать их и для вас).

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

1
ответ дан 6 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: