powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен совет по хранению общих объектов
22 сообщений из 22, страница 1 из 1
Нужен совет по хранению общих объектов
    #34823516
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

В web-приложении есть объекты-классы, которые создаются по данным из неизменяемых таблиц базы и являются общими для всех пользователей. Сейчас у меня такие экземпляры хранятся в каждой сессии, но логично было бы объявить их глобально и инициализировать при старте приложения. Посоветуйте, как лучше реализовать эту задачу. Слышал, что можно хранить объекты в AppContext, но пока не представляю, как, когда и с помощью чего впихивать и вытаскивать из него данные.

Спасибо
С уважением, Семен Попов
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823566
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ServletContext контейнетрый объект общий для веб приложения, до него можно обратиться из любого web компонента.

А вот listener на его создание и удаление.
Код: plaintext
1.
2.
3.
4.
5.
 public   interface  ServletContextListener  extends  java.util.EventListener {
    
     void  contextInitialized(javax.servlet.ServletContextEvent servletContextEvent);
    
     void  contextDestroyed(javax.servlet.ServletContextEvent servletContextEvent);
}

ну и зарегистрировать свою реслизацию надо в дескрипторе развертывания.
Код: plaintext
1.
2.
3.
4.
<listener>
	<listener- class >
		ServletContextListenerImpl
	</listener- class >
</listener>
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823740
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0ServletContext контейнетрый объект общий для веб приложения, до него можно обратиться из любого web компонента.
Спасибо.
1. Я понял, что contextInitialized вызывается при старте вэб-приложения. Не в нем ли я должен выполнять создание и инициализацию своих объектов?
2. Можно ли к ServletContext обратиться из метода произвольного класса, например того, который может использоваться в doPost/doGet-методах сервлета?
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823806
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. Я понял, что contextInitialized вызывается при старте вэб-приложения. Не в нем ли я должен выполнять создание и инициализацию своих объектов? Да в этом методе ты можешь создавать свои общие объекты, только нужно учитывать что у тебя допустим обращение к БД быть неудачным, и как это обработать зависит от приложения, либо сказать пользователю что приложение к работе не готового, либо поробовать как-то отложенно данные погдгружать.
автор2. Можно ли к ServletContext обратиться из метода произвольного класса, например того, который может использоваться в doPost/doGet-методах сервлета? К ServletContext могут обратиться (Filter, Servlet, Listener, Custom Tags), для простых объектов ты должен сам об этом позаботиться. Ты можешь например в сервлете эти данные получить и дальше передавать их нужным объектам как параметры.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823818
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov1. Я понял, что contextInitialized вызывается при старте вэб-приложения. Не в нем ли я должен выполнять создание и инициализацию своих объектов?
- это было бы логично, хотя и не обязательно (код приведен выше)
Semen Popov
2. Можно ли к ServletContext обратиться из метода произвольного класса, например того, который может использоваться в doPost/doGet-методах сервлета?
- да.
Код: plaintext
1.
Object object=getServletContext().getAttribute("name") ;
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823955
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0Да в этом методе ты можешь создавать свои общие объекты, только нужно учитывать что у тебя допустим обращение к БД быть неудачным, и как это обработать зависит от приложения, либо сказать пользователю что приложение к работе не готового, либо поробовать как-то отложенно данные погдгружать.
Как раз обращение к базе мне и будет нужно. Посмотрим, что из этого получится.
Кстати, можно ли из программы выполнить рестарт приложения? Например, на одной из страниц, доступной для администратора, разместить ссылку, которая бы выполняла перезагрузку приложения на сервере.
vas0К ServletContext могут обратиться (Filter, Servlet, Listener, Custom Tags), для простых объектов ты должен сам об этом позаботиться. Ты можешь например в сервлете эти данные получить и дальше передавать их нужным объектам как параметры.
Да, передачу параметров я тоже рассматривал. Но, хотелось бы, чтобы глобальный объект был действительно глобальным.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34823960
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov- да.
Код: plaintext
Object object=getServletContext().getAttribute("name") ;

Спасибо. Неужели из произвольного класса так можно достучаться до объекта? Что-то тут не хватает.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824065
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov Kachalov- да.
Код: plaintext
Object object=getServletContext().getAttribute("name") ;

Спасибо. Неужели из произвольного класса так можно достучаться до объекта? Что-то тут не хватает.
Из произвольного класса, разумеется, нельзя. В метод произвольного класса надо будет передавать контекст в качестве параметра, а лучше - как уже написали - передавать именно необходимый инстанс-атрибут. Кроме того, в кластеризованных приложениях ServletContext не является расшаренным (кроме инициализационных параметров), и использовать общие для нод кластера данные через ServletContext тоже не получится.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824110
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen PopovДа, передачу параметров я тоже рассматривал. Но, хотелось бы, чтобы глобальный объект был действительно глобальным.
Как вариант - можно использовать внутренний серверный кэш (но тогда получится уже server-speicific).
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824155
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗашедшийИз произвольного класса, разумеется, нельзя.
Делаю вывод, что web-программировании на ява вообще нельзя создавать глобальные переменные в буквальном смысле, которые бы можно было инициализировать и заполнять в любом месте кода, как это можно сделать, например, в виндовых приложениях. Там объявленная глобальная переменная может быть прочитана и отредактирована в любом месте - классе, процедуре и т.д. В web получаем относительную глобальность. Например, мои объекты в ServletContext относительно сессий глобальны, но не глобальны относительно произвольных классов.
Поправьте меня, если не так.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824264
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальные переменные - зло.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824497
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen PopovДелаю вывод, что web-программировании на ява вообще нельзя создавать глобальные переменные в буквальном смысле, которые бы можно было инициализировать и заполнять в любом месте кода, как это можно сделать, например, в виндовых приложениях.
Технология сервлетов это часть спецификации Java EE, в которой в качестве "расшареных" объектов используются EJB-компоненты. Доступ к ним возможен откуда угодно через JNDI. Так что Ваш вывод основан на недостаточном знании спецификации :)
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824643
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmГлобальные переменные - зло.
Эт с какой стороны посмотреть. В программировании память и скорость вечно противостояли друг другу. Одну задачу можно было решить двумя путями: сожрать память, но выиграть в скорости или сэкономить память, но затратить большее время выполнения. Раньше я даже не знал, что такое глобальные переменные. Старался их не использовать, пытался как-нибудь обойти. Теперь, когда имеются столь мощные машины, я не задумываюсь над этим, но явным приверженцем не являюсь.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824653
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KachalovТехнология сервлетов это часть спецификации Java EE, в которой в качестве "расшареных" объектов используются EJB-компоненты. Доступ к ним возможен откуда угодно через JNDI. Так что Ваш вывод основан на недостаточном знании спецификации :)
Спасибо. Я действительно мало знаю матчасть. Но сильно не бейте, буду учиться.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824711
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov Semen PopovДелаю вывод, что web-программировании на ява вообще нельзя создавать глобальные переменные в буквальном смысле, которые бы можно было инициализировать и заполнять в любом месте кода, как это можно сделать, например, в виндовых приложениях.
Технология сервлетов это часть спецификации Java EE, в которой в качестве "расшареных" объектов используются EJB-компоненты. Доступ к ним возможен откуда угодно через JNDI. Так что Ваш вывод основан на недостаточном знании спецификации :)
Именно что типо "расшаренных".
Они таковыми не являются (с т.з. public static полей).
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824901
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov ЗашедшийИз произвольного класса, разумеется, нельзя.
Делаю вывод, что web-программировании на ява вообще нельзя создавать глобальные переменные в буквальном смысле...
И это вполне понятно и логично, если чуть-чуть углубиться в исторический аспект. Дело в том, что вэб-приложения изначально проектировались как распределенные. С точки зрения конечного пользователя (и, кстати, разработчика J2EE-приложения, но это - в идеале) не должно быть никакой разницы между работой системы на единственном сервере, на кластере, объединяющем десяток физически разных серверов, многопоточном сервере а-ля "виртуальный кластер" и т.д. В винде приложение работает в едином адресном пространстве, и из любой точки этого пространства всегда можно поиметь прямой доступ по указателю к конкретной переменной, причем - любого типа. В случае с вэб-сервером мы можем иметь кучу разных процессов, с недоступными друг другу пространствами, кроме того - если надо хранить какой-то достаточно объемный инстанс, то еще и придется реплицировать этот объект между нодами кластера, актуализировать его состояние при каждом изменении... В общем, уважаемый Семен, лучше сразу забудьте про "как в виндус", создание распределенных систем - совсем иная песня.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824908
kest_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем не устраивает класс singleton? Доступен из любого метода, есть возможность ленивой инициализации любых.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824910
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmИменно что типо "расшаренных". Они таковыми не являются (с т.з. public static полей).
Адназначна! Хотя использовать их для хранения "общих" объектов все же можно, только надо хорошо подумать о процессе сериализации этих общих объектов в БД (ну или пул JMS, к примеру), опять же синхронизации и тому подобном.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34824959
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kest_ruА чем не устраивает класс singleton? Доступен из любого метода, есть возможность ленивой инициализации любых.
Проводим простой опыт - добавляем синглтон в J2EE-приложение, в этом синглтоне имеем поле типа int, потом деплоим приложение на кластер из двух серверов. Устанавливаем в статик-секции синглтона полю random-значение, по запросу пользователя (HTTP-GET) выводим в сервлете на экран значение MySingleton.getInstance().getIntField(), запускаем это дело циклом с клиента и в процессе переключения запросов балансировщиком загрузок с одной ноды на другую наблюдаем в отлике два разных числа. Все счастливы
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34825012
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для данной фичи не нужен кластер. достаточно в jboss создать
по синглтону в сервлете и в бине.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34825487
kest_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все зависит от исходной задачи. Не все же используют кластеры? В первоначальном вопросе шла речь о неизменяемых данных из базы, и я не вижу причин заморачиваться со сложными решениями. Что такого даже если данные перечитаются несколько раз, это всяко лучше чем для каждой сессии.
...
Рейтинг: 0 / 0
Нужен совет по хранению общих объектов
    #34825683
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синглтоны это вселенское зло. Проблема синхронизации в кластере (несомненно, актуальная) это еще цветочки по сравнению с жесткими зависимости всех и вся от этих недо-объектов.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен совет по хранению общих объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]