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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GWT. Servlet с static классом. !! Опасно или нет? 
:(
    Опции темы
unkis
Дата 20.1.2011, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Ребята есть GWT приложение, в етом преложении реализованно следующее.

Код

public class CommunicationServiceImpl<T> extends RemoteServiceServlet implements CommuncationService<T>
{
    public static AAPSession session;
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        CommunicationServiceImpl.session = new AAPSession(request.getSession());
                
        super.service(request, response);
    }
    
    .....
}

public class AAPSession extends StandardSessionFacade
{

    public AAPSession(HttpSession session)
    {
        super(session);        
    }
    
    ......
}




и дальше в коде можно встретить следующее:


Код

 Long userId = (Long)CommunicationServiceImpl.session.getAttribute("userID");



Как такое может работать? если статическое поле "session" для всех пользователей должно быть одинаковое или я что-то не понимаю?



--------------------
www.unkis.com
PM MAIL WWW   Вверх
emmanuil
Дата 21.1.2011, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 3



Потому что инициализируешь поле session для каждого запроса. Посмотри ЖЦ сервлетов. И получается, что толку нету, что это поле статическое.
И если нужно иметь HttpSession чтобы все работало, то обновляй там в методе не поле session, а поле класса AAPSession, которое хранит HttpSession.


Это сообщение отредактировал(а) emmanuil - 21.1.2011, 20:24
PM MAIL   Вверх
SoulSeeker
Дата 22.1.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(emmanuil @  21.1.2011,  20:23 Найти цитируемый пост)
И получается, что толку нету, что это поле статическое.

Как это толку нету? Это будет одна разделяемая сессия для всех клиентов.
 session всегда будет инициализироваться тем, кто последний раз проходил через метод service. 
Не знаю, как такое может работать.
PM MAIL WWW   Вверх
emmanuil
Дата 26.1.2011, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 3



Цитата(SoulSeeker @  22.1.2011,  15:10 Найти цитируемый пост)
Как это толку нету?

А так. Если нужно статическое поле sesion и чтобы она хранила одни данные для всех и при этом продолжало всё работать (из указанного примера), то нужно обновлять поле класса AAPSession, а не каждый раз создавать экземпляр. Смотрю по тому, что дано. Не знаю, что там в самом классе реализовано.
Статика тут только для удобства получения данных текущего запроса и кроме этого толку в ней нет, так как при следующем запросе, все обновится и ничего разделяемого не будет. Можно сделать в классе AAPSession поле currentRequest, например, и его обновлять в сервлете.
Цитата(SoulSeeker @  22.1.2011,  15:10 Найти цитируемый пост)
Это будет одна разделяемая сессия для всех клиентов.
 session всегда будет инициализироваться тем, кто последний раз проходил через метод service.

Во первых, сессия у каждого своя.
Во вторых, если она при каждом запросе обновляется, откуда она будет одна разделяемая для всех клиентов? Поле session обновится данными клиента отправившего запрос. И так будет при каждом запросе.
Цитата(SoulSeeker @  22.1.2011,  15:10 Найти цитируемый пост)
Не знаю, как такое может работать. 

Как это работает, я уже описал. Возможно, сервлет слушает все запросы и поэтому проблем не возникает.

Если это все работает, то неопасно, может кто-то другой считает иначе. Просто нужно помнить про статическое поле.
PM MAIL   Вверх
SoulSeeker
Дата 26.1.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



emmanuil, при двух и более параллельных запросах статическое поле session никак не будет разным у всех потоков. Поэтому, отвечая на вопрос
Цитата

Опасно или нет?
,
да, опасно. Потому что на поле session не стоит синхронизация. Допустим, один поток инициализирует, другой тут же меняет session на свое значение, потому что запрос пришел на доли секунды позже.

Это сообщение отредактировал(а) SoulSeeker - 26.1.2011, 21:39
PM MAIL WWW   Вверх
emmanuil
Дата 28.1.2011, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 3



Цитата(SoulSeeker @  26.1.2011,  19:36 Найти цитируемый пост)
да, опасно. Потому что на поле session не стоит синхронизация. Допустим, один поток инициализирует, другой тут же меняет session на свое значение, потому что запрос пришел на доли секунды позже.

Это да. И я не просто так написал, что помнить нужно про статическое поле.
Если есть интенсивная работа клиентов, то блокировка в методе service может привести к задержкам. Скорее нужно пересмотреть определение текущего пользователя.
PM MAIL   Вверх
SoulSeeker
Дата 29.1.2011, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Короче говоря, данный код неверен с точки зрения доступа к разделяемому ресурсу. Решение - убрать модификатор static с поля session и не париться по поводу левого изменения от разных потоков. Такие ошибки очень трудно выявляются впоследствии и их появление трудно воспроизвести.
PM MAIL WWW   Вверх
_sten_
Дата 29.1.2011, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



можно использовать ThreadLocal тогда проблем с конкурентным изменением не будут, но вопрос наснолько это коректно использовать с точки зрения дизайна остаеться открытым(ThreadLocal привязывает обьект к текущему токотку, и если создатасть новые потоки то будут проблемы), но как квикфикс пойдет точно.


--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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