2013-06-04 5 views
0

J'ai un service Web jax-ws avec plusieurs gestionnaires. J'ai un objet particulier qui est coûteux en termes de performances à lancer. J'ai besoin de cet objet pour traiter chaque demande au service web.Bloc statique dans le gestionnaire de services Web

Est-ce une solution de placer cet objet dans un bloc statique? Comme un bloc statique est créé au moment du chargement de la classe, cela améliorera les performances. Mais réalise-t-il toujours ce dont j'ai besoin. J'ai besoin du même objet gardé dans la mémoire et réutilisé pour toutes les demandes. Mais comme je sais dans un service Web, chaque requête est allouée à un objet thread dans le bloc statique ne sera pas partagé par les threads. c'est? En attendant un peu d'explication ici les gars.

Merci

+0

Les variables statiques sont partagées par des fils. Cependant, ils ne sont pas nécessairement thread-safe. Si votre objet est thread-safe, cela pourrait être une option. –

+0

Il s'agit d'un objet en lecture seule. Mais les blocs statiques ne sont pas partagés avec le thread. est-ce ou n'est-ce pas? –

Répondre

0

Un bloc statique est un morceau de code qui est exécuté une fois lorsque la classe est initialisé par le chargeur de classe. Vous pouvez l'utiliser pour configurer votre objet complexe, puis garder une référence dans une variable statique comme ceci:

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; 
    } 
} 

Si vous faites cela dans un environnement multi-thread comme un servlet ou un webservice vous devez assurez-vous que l'état de LanguageLookup ne peut pas changer après son initialisation. S'il utilise ses propres dépendances pour des opérations autres que son initialisation, celles-ci doivent également être sans état.

Je pense que ce n'est généralement pas une bonne idée de le faire de cette façon parce que vous êtes en train de câbler votre classe au LanguageLookup, ce qui le rend étroitement couplé et plus difficile au test unitaire.

Il est très facile d'utiliser un cadre d'injection de dépendance comme le Printemps de mettre en place singletons:

Lorsqu'un haricot est un singleton, une seule partagé par exemple de la fève sera gérer et toutes les demandes de haricots avec un ID ou des ID correspondant à la définition du bean , une seule instance de bean spécifique sera renvoyée .

Dans le contexte de l'application que vous auriez quelque chose comme:

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

Et dans votre code:

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; 
    } 
} 
Questions connexes