2013-06-04 1 views
0

У меня есть веб-сервис jax-ws с несколькими обработчиками. У меня есть конкретный объект, который требует высокой производительности для инициирования. Мне нужен этот объект для обработки каждого запроса на веб-службу.Статический блок в обработчике веб-сервиса

Является ли решение помещать этот объект в статический блок? Поскольку статический блок создается во время загрузки класса, он дает повышение производительности. Но все же он достигает того, что мне нужно. Мне нужен тот же объект, хранящийся в памяти и повторно используемый для всех запросов. Но, как я знаю в веб-службе, каждый запрос, выделенный объекту потока в статическом блоке, не будет совместно использоваться потоками. это?

Ожидая немного объяснения здесь, ребята.

Спасибо

+0

Статические переменные являются общими нитями. Однако они не обязательно являются потокобезопасными. Если ваш объект является потокобезопасным, это может быть вариант. –

+0

Это объект только для чтения. Но статические блоки не разделяются в потоке. это или нет? –

ответ

0

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

public class MyClass { 

    private static final LanguageLookup languageLookup; 

    static { 
     languageLookup = new LanguageLookup(); 
     languageLookup.loadData(); 
    } 

    public Response handleRequest(Request request) { 
     String language = languageLookup.lookup(request.getCountryCode()); 
     response.setLanguage(language); 
     return response; 
    } 
} 

Если вы делаете это в многопоточной среде, как сервлет или веб-сервиса вам нужно убедитесь, что состояние LanguageLookup не может измениться после его инициализации. Если он использует собственные зависимости для операций, отличных от его инициализации, они также должны быть неактивными.

Я думаю, что это вообще не очень хорошая идея, потому что вы жестко подключаете свой класс к LanguageLookup, делая его плотно связанным и более сложным для тестирования.

Это очень простой в использовании рамки инъекции зависимостей, как Spring, чтобы установить singletons:

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

В контексте приложения вы бы что-то вроде:

<bean name="languageLookup" class="com.acme.foo.LanguageLookup" singleton="true" init-method="loadData"/> 

И в вашем коде:

public class MyClass { 

    private LanguageLookup languageLookup; 

    public Response handleRequest(Request request) { 
     String language = languageLookup.lookup(request.getCountryCode()); 
     response.setLanguage(language); 
     return response; 
    } 

    // called by Spring 
    public void setLanguageLookup(LanguageLookup languageLookup) { 
     this.languageLookup = languageLookup; 
    } 
} 
Смежные вопросы