Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Singleton в Web приложении


Автор: Hidrag 14.2.2007, 13:32
Такой вопрос: у меня есть веб приложение и есть БД работа с бд осуществляется через класс по паттерну Singleton. То есть при запросе клиента получаю инстанс класса и выполняю какие то действия, все последующие действия клиента с бд опять же осуществляются через этот инстанс.

Но одно мне пока неизвестно: допустил клиент работает с веб приложением, для него создался инстанс класса для операций с БД. В этот момент подключается второй клиент, что будет в этом случае? При выполнении гетИнстанс он получит уже созданный инстанс предыдущим клиентом или для него будет создан свой объект, по скольку клиенты в разных сессиях?

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

Автор: tux 14.2.2007, 13:44
Цитата(Hidrag @  14.2.2007,  13:32 Найти цитируемый пост)
В этот момент подключается второй клиент, что будет в этом случае? При выполнении гетИнстанс он получит уже созданный инстанс предыдущим клиентом или для него будет создан свой объект, по скольку клиенты в разных сессиях?

Такая ситуация называется гонкой и как раз для того, чтобы избежать ее метод getInstance() объявляется synchronized. В этом случае только один поток в каждый момент времени может этот метод выполнить и такой неоднозначности не будет.

Цитата(Hidrag @  14.2.2007,  13:32 Найти цитируемый пост)
Например, у томката есть какие то методы для работы с БД, я пока не смотрел в ту сторону, а наверное есть смысл, не зря же они там smile 

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

Автор: Hidrag 14.2.2007, 13:54
Цитата(tux @  14.2.2007,  13:44 Найти цитируемый пост)
Что за методы? Никогда не слышал.

Вот это например: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

Получается что для веб приложения много подключенных клиентов то же самое что для десктоп приложения много потоков которые обращаются к одному ресурсу? smile То есть однажды соданный интсанс будет юзаться всеми клиентами и умрет только когда заавершится последняя сессия?

Автор: tux 14.2.2007, 14:19
Цитата(Hidrag @  14.2.2007,  13:54 Найти цитируемый пост)
Получается что для веб приложения много подключенных клиентов то же самое что для десктоп приложения много потоков которые обращаются к одному ресурсу?

Примерно так. Каждый запрос к веб-приложению обрабатывается одним потоком. То есть привязки потоков к пользователям как правило нет. Поток для выполнения поступившего запроса выбирается из пула свободных.

Цитата(Hidrag @  14.2.2007,  13:54 Найти цитируемый пост)
То есть однажды соданный интсанс будет юзаться всеми клиентами и умрет только когда завершится последняя сессия? 

Нет, когда завершит работу JVM. Экземпляр объекта в Singleton хранится в статическом поле, пока существует класс, будет существовать и этот экземпляр.

Цитата(Hidrag @  14.2.2007,  13:54 Найти цитируемый пост)
Вот это например: http://tomcat.apache.org/tomcat-5.5-doc/jn...ples-howto.html

А, ну дак это не методы. Это вполне стандартный способ доступа к источнику данных используя JNDI.

Автор: w1nd 14.2.2007, 14:56
Цитата(tux @  14.2.2007,  14:19 Найти цитируемый пост)
Нет, когда завершит работу JVM. Экземпляр объекта в Singleton хранится в статическом поле, пока существует класс, будет существовать и этот экземпляр.

Или когда приложение передеплоят. Заморочки с загрузкой/выгрузкой классов никто не отменял.

Автор: tux 14.2.2007, 15:01
Цитата(w1nd @  14.2.2007,  14:56 Найти цитируемый пост)
Или когда приложение передеплоят. Заморочки с загрузкой/выгрузкой классов никто не отменял.

Да, точно. Про это забыл. smile

Автор: alexsmirnov 17.2.2007, 01:03
НЕ ИСПОЛЬЗУЙТЕ СИНГЛЕТОН в web-приложениях в чистом виде ! В силу особенности загрузчиков, или если переложите куда-нибудь в общие библиотеки, может оказаться что один экземпляр будет использоваться сразу несколькими приложениями, или остаться активным после redeploy. Экземпляр можно привязать к ContextClassLoader ( он у каждого приложения свой ) или, лучше в init-методах создавать и сохранять в ServletContext. Тогда можно и закрытие отслеживать по событиям.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)