Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Singleton в Web приложении, один или несколько? 
:(
    Опции темы
Hidrag
Дата 14.2.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 2
Всего: 25



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

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

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


--------------------
user posted image
PM WWW ICQ   Вверх
tux
Дата 14.2.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



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

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

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

Что за методы? Никогда не слышал. В любом случае средства API конкретного сервера приложений следуем использовать только в крайнем случае и при полной уверенности, что не придется переезжать на какой-то другой сервер.
PM MAIL Skype GTalk Jabber YIM   Вверх
Hidrag
Дата 14.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 2
Всего: 25



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

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

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


--------------------
user posted image
PM WWW ICQ   Вверх
tux
Дата 14.2.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(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.
PM MAIL Skype GTalk Jabber YIM   Вверх
w1nd
Дата 14.2.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 7
Всего: 54



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

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

Это сообщение отредактировал(а) w1nd - 14.2.2007, 14:56


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
tux
Дата 14.2.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



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

Да, точно. Про это забыл. smile
PM MAIL Skype GTalk Jabber YIM   Вверх
alexsmirnov
Дата 17.2.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.8.2005

Репутация: 5
Всего: 7



НЕ ИСПОЛЬЗУЙТЕ СИНГЛЕТОН в web-приложениях в чистом виде ! В силу особенности загрузчиков, или если переложите куда-нибудь в общие библиотеки, может оказаться что один экземпляр будет использоваться сразу несколькими приложениями, или остаться активным после redeploy. Экземпляр можно привязать к ContextClassLoader ( он у каждого приложения свой ) или, лучше в init-методах создавать и сохранять в ServletContext. Тогда можно и закрытие отслеживать по событиям.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.