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


Автор: Samotnik 23.10.2007, 17:56
Значит есть следущее:
Сервлет
Код

public class SayHello extends HttpServlet {
    private static final Logger log = Logger.getLogger(SayHello.class);
    MessageService msgService = new MessageService();

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String message = request.getParameter("Name");
        log.debug("message = " + message);

        request.setAttribute("fromServlet", msgService.getTimeBasedPrefixMessage(message));

        log.info("Info log message:))))   ");
        request.setAttribute("MessageType", request.getMethod());
        request.getRequestDispatcher("/indexPast.jsp").forward(request, response);
    }
}

и класс MessageService  (обычный) в котором, тупо передается приветствие в зависимости от времени суток (к примеру Доброе утро, ..      Добрый день, ....    и т.д.)
Код

public class MessageService {
    private static Logger log = Logger.getLogger("log4j.properties");

    MessageService() {
    }

    public String getTimeBasedPrefixMessage(String name) {
        String messageOfDay;
        Calendar cal = new GregorianCalendar();

        int hour = cal.get(Calendar.HOUR_OF_DAY);
        log.info("Time (hour): " + hour);

        if (hour <= 9)
            messageOfDay = "Good Morning, ";
        else if (hour <= 12 && hour >= 9)
            messageOfDay = "Good Day, ";
        else if (hour <= 17 && hour >= 12)
            messageOfDay = "Gootten  tag, ";
        else if (hour <= 24 && hour >= 17)
            messageOfDay = "Good  evening, ";
        else
            messageOfDay = "Good  night, ";

        log.info("Result message : " + messageOfDay);

        return messageOfDay + name;
    }

Любопытно кзнать на счет этой строки  MessageService msgService = new MessageService();  из сервлета!  Нужна ли она, а если нужна, то чем ее заменить, ведь если на мой сервер полезут 200  человек, то этот обьект для Каждого  будет создаваться заново, Так вот вопрос, как сделать что бы  оптимизировать эту строку (чтоб не создавался обьект каждый раз, когда  идет запрос на сервер ???)

Добавлено @ 18:08
Вобщем как заменить создание обьекта MessageService msgService = new MessageService();  на что нибудь  НЕ генерирующееся при каждом  запросе!!

Автор: AntonSaburov 23.10.2007, 18:25
Так сделай метод static - тогда он будет вызываться без создания объекта.

Автор: Samotnik 23.10.2007, 18:29
AntonSaburov,   smile   Блин, попробывал - не работает!!!
пишу
Код

request.setAttribute("fromServlet", getTimeBasedPrefixMessage(message));

и есттно  его сделал  static ,  а  мне ошибка в ответ 
Cannot find symbol method  getTimeBasedPrefixMessage()
 smile 

Автор: AntonSaburov 23.10.2007, 18:35
Эй, ты чего.

static сделать для класса MessageService.

Код

class MessageService
{
   public static String getTimeBasedPrefixMessage(String name) 
   {
   .......
   }
}


А вызов внутри сервлета в таком виде

Код

request.setAttribute("fromServlet", MessageService.getTimeBasedPrefixMessage(message));

Автор: Samotnik 23.10.2007, 18:35
Прошу прощения, я ступил, нужно ведь имя класса  указывать!!!

Автор: Samotnik 23.10.2007, 18:55
AntonSaburov,  Пасибо вам!  Способ классный, но сказали, что не совсем корректный!  Т.е. статик метод вызывает статик данные, и если 10 юзеров начнут их юзать, то с данными (или  сервером) что - то случиться!!  (Я точно не помню, но как-то так обьяснили)
Может есть еще какой нибудь способ вызвать метод из другого класса, не создавая его обьекта!!!

Автор: solve 23.10.2007, 19:04
потому что не указал, метод какого класса вызываетсяsmile)
Вариант со статическим методом у меня заработал. но в любом случае внутри вызываемого метода будет каждый раз вызываться инициализация того же календаря и выигрыш в производительности будет невелик,поэтому его стоит сделать статической переменной класса 

Автор: Samotnik 23.10.2007, 19:09
solve,  Я же написал, что я ступил, и все у меня заработало. Но заказчика, не устраивает такой вариант, т. к. он .....  ну в общем не устраивает он его.
Есть еще какие-нить предположения о том, как можно заменить создание обьекта и static  метод ??

Автор: Zamuta 23.10.2007, 22:37
Цитата
ведь если на мой сервер полезут 200  человек, то этот обьект для Каждого  будет создаваться заново


Да, будет создаваться заново, но если я не ошибаюсь, то неиспользуемые объекты удаляются сборщиком мусора. 

Samotnik, почитайте Брюса Эккеля и основные принципы ооп.

Автор: Kangaroo 24.10.2007, 01:25
Цитата

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

Может от тебя хотят использование Singleton шаблона?
Почитай http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html.
Ну или любую статью в интернете, по Синглтону их много

Автор: Samotnik 24.10.2007, 11:35
2 all
Всем спаисбо за участие, оказалось вообще  все просто. Нужно было просто создать обьект в методе Инит!!  Тогда, он походу будет ток один раз создаваться!  smile 

Автор: Kangaroo 24.10.2007, 11:44
Samotnik,
но про Синглетон ты все равно почитай smile, на будущее будет полезно.

Автор: Samotnik 24.10.2007, 11:47
Kangaroo,  ок!  Спс!  smile 

Автор: fixxer 25.10.2007, 10:01
Цитата(Samotnik @ 24.10.2007,  11:35)
2 all
Всем спаисбо за участие, оказалось вообще  все просто. Нужно было просто создать обьект в методе Инит!!  Тогда, он походу будет ток один раз создаваться!  smile

Сильно в этом сомневаюсь. Ну создашь ты его в ините и куда положишь? В поле сервлета? Нехорошо.

Добавлено через 1 минуту и 28 секунд
Я предлагаю по совету Zamuta забить. Не такой уж тяжелый объект. GC разрулит.

Автор: AlexeyVorotnikov 25.10.2007, 10:23
Кстати, а с чего это вы взяли, что объект MessageService  будут создаваться при каждом запросе?

Автор: fixxer 25.10.2007, 10:32
O! Не посмотрел код внимательно. Внесите MessageService msgService = new MessageService(); в метод. Использование полей сервлета не очень хорошая практика. Можно также положить в сессию, в JNDI или Singleton, как Вам уже говорили.

Добавлено через 9 минут и 36 секунд
Цитата(AlexeyVorotnikov @ 25.10.2007,  10:23)
Кстати, а с чего это вы взяли, что объект MessageService  будут создаваться при каждом запросе?

А с такой, что нельзя гарантировать наличие одного экземпляра класса сервлета. При каждом или не при каждом, в общем случае это не определено.

Автор: AlexeyVorotnikov 25.10.2007, 11:17
Цитата(fixxer @  25.10.2007,  11:32 Найти цитируемый пост)
Можно также положить в сессию, в JNDI или Singleton

Можно еще в контекст. smile

Цитата(fixxer @  25.10.2007,  11:32 Найти цитируемый пост)
А с такой, что нельзя гарантировать наличие одного экземпляра класса сервлета. При каждом или не при каждом, в общем случае это не определено. 

Да, Вы правы, количество экземпляров сервлета не определено.

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