Как синглтон используется для управления подключением к базе данных? - PullRequest
2 голосов
/ 07 апреля 2011

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

Для соединений с базой данных мы всегда используем одноэлементный объект. Когда к базе данных обращаются тысячи пользователей, как поддерживается производительность? Я имею в виду, если есть тысячи запросов в секунду, как управляется соединение с базой данных, поскольку мы используем синглтон? Сериализуются ли запросы к базе данных? Или синглтон в этих случаях не используется?

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 07 апреля 2011

Я не уверен, что вы перепутали использование простого синглтона с сервисным локатором.Оба они являются шаблонами дизайна.Шаблон локатора службы используется приложениями, чтобы гарантировать, что существует один класс, на который возложена ответственность за получение и предоставление доступа к базам данных, файлам, очередям JMS и т. Д.

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

Кстати, аргумент о

"это для того, чтобывсегда есть только одно активное соединение с вашей БД "

неверно и вводит в заблуждение.Вполне возможно, что соединение может быть закрыто / восстановлено, если оставлено неактивным в течение довольно длительного периода времени.Так что кеширование соединения с базой данных не одобряетсяЕсть одно отклонение от этого аргумента;«Повторное использование» соединения, полученного из пула соединений, рекомендуется при условии, что вы делаете это с тем же контекстом, то есть в рамках того же HTTP-запроса или пользовательского запроса (в зависимости от того, что применимо).Это сделано, очевидно, с точки зрения производительности, поскольку установление новых соединений может оказаться дорогостоящей операцией.

2 голосов
/ 07 апреля 2011

Даже если вы не указали ничего о сессиях / транзакциях / ORM, я думаю, что ваш вопрос связан с Hibernate, JPA или другим фоном ORM.

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

Теперь, используя шаблон фабрики, мы можем получить столько похожих объектов, сколько захотим ... Но сама фабрика должна быть одноэлементной. Таким образом, в операциях с БД объекты entityManagerFactory или sessionFactory хранятся как одиночные.

Когда вы думаете об этом, это имеет смысл, потому что в конце концов sessionFactory представляет конфигурацию (DB, UserID, пароль, размер пула соединений, кэширование и т. Д.). Для выполнения транзакции с БД требуется не фабрика, а объект (сеанс), созданный фабрикой. Этих вы можете иметь столько, сколько хотите. Но если у вас есть несколько фабрик, это просто ненужное создание одинаковых (похожих) объектов.

Мы используем пул соединений как в обычном jdbc, так и в ORM.

2 голосов
/ 07 апреля 2011

Рекомендую использовать пул соединений
http://www.java2s.com/Code/Java/Database-SQL-JDBC/PooledConnectionExample.htm

1 голос
/ 07 апреля 2011

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

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

Таким образом, ваше приложение может одновременно создавать миллионы соединений с помощью синглтона, если оно способно создавать миллионы потоков одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...