2016-01-27 3 views
1

Я пытаюсь использовать Postgresql с Spring.Postgres JDBC DataSource экземпляр

Способ, которым он был написан, состоял в том, чтобы инициировать экземпляр DataSource для каждого запроса/конкретного набора запросов, которые должны были быть выполнены.

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

Это приведет к утечке памяти, если здесь используется множество экземпляров?

+0

Не связывайте ['DataSource'] (https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html) с помощью [' Connection'] (https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html). Экземпляр первого содержит экземпляры второго. На самом деле неправильное название «DataSource» должно было быть названо «ConnectionSource». –

ответ

1

Создание нового DataSource для каждого запроса - плохая идея из-за накладных расходов на установление соединения с сервером базы данных. Существует два шаблона проектирования, которые вы можете выбрать:

  1. A DataSource был создан для каждой сессии или вашего примера. Преимущество состоит в том, что вы можете адаптировать экземпляр со всеми деталями, которые используются в исходном приложении. Недостатком является то, что вам может понадобиться много сеансов - есть ресурсы как на сервере, так и на клиенте, - которые могут простаивать большую часть времени между запросами, но при этом использовать эти ресурсы.
  2. Использовать JNDI (Tutorial) connection pool. Соединения с базой данных разделяются между сеансами. Это, как правило, намного более эффективно, поскольку соединения остаются открытыми и будут использоваться более интенсивно. С нижней стороны каждое соединение имеет все данные о соединении, включая имя пользователя и пароль, и это может не очень хорошо работать с вашим дизайном базы данных.

Для уточнения:

  • Если каждый пользователь приложения имеет свои собственные role в базе данных они должны установить свое собственное имя роли и пароль открытие соединения: пул соединений не представляется возможным и вы должны установить DataSource для каждой сессии.
  • Если пользователи вашего приложения используют базу данных role в базе данных - скажем, «webuser» - тогда вы можете использовать пул соединений с деталями этой роли. Это также будет работать, если ваше приложение имеет несколько таких ролей: «webuser», «webmanager», «webadmin». Затем вам нужно создать DataSource для каждой из этих ролей в магазине JNDI.
+0

Хороший ответ, но чтобы быть понятным, «DataSource», хранящийся на совместимом с JNDI сервером, не обязательно поддерживается пулом соединений. –

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