2010-06-03 5 views
2

J'ai essayé de récupérer des données de configuration codées en dur à partir d'une application web Tomcat sur laquelle je travaille, dans JNDI (web.xml) pour rendre l'application plus configurable. Au lieu de faire continuellement des recherches dans InitialContext, je mets en cache les recherches et le InitialContext en utilisant un singleton.Tomcat, Singletons, & ServerContextListener

Bien sûr, lorsque j'arrête et démarre l'application, l'instance statique de mon singleton reste active. Par conséquent, le cache n'est pas "rafraîchi". Ma question est double - j'isole ce singleton à une seule application web - y at-il des effets imprévus dans Tomcat [J'ai lu que & tomcat de singleton ne mélange pas]? Et quel est le moyen le plus simple d'effacer l'instance singleton lorsque l'application est arrêtée (je pensais écrire un ServerContextListener séparé qui effacerait l'instance).

(Note: Excusez-moi si je la terminologie mal - s'il vous plaît corriger - c'est ma première incursion dans la programmation avec Tomcat)

Répondre

2

Au lieu de faire en permanence dans le InitialContext des recherches, je suis la mise en cache et les recherches InitialContext en utilisant un singleton

Ok, donc vous mis en place un Service Locator avec un cache, que [est | a] une pratique courante pour le niveau Web. Voici an example.

Bien sûr, quand je me arrête et démarre l'application, l'instance statique de mon singleton reste en vie

Hmm ... à moins que vous déployez votre singleton dans le Common class loader ($CATALINA_HOME/lib) il shouldn » t. Vous ne faites pas ça, n'est-ce pas?

J'isoler ce singleton à une seule application Web - il des effets imprévus dans Tomcat

Rien que je sache.

Et quelle est la meilleure façon de supprimer l'instance singleton lorsque l'application est arrêté

Déployez votre singleton dans le chargeur de classe webapp (à savoir dans /WEB-INF/classes ou /WEB-INF/lib) et undeploy l'application comme l'a suggéré.

+0

Oui, exactement ce que j'ai fait, un localisateur de service primitif, je ne le déploie pas dans le chargeur de classe Common, mais dans le chargeur de classe webapp. On dirait que je vais devoir compter sur le déploiement et le non déploiement de l'application pour actualiser le cache. Merci! – Watson

0

Comment votre singleton est créé?

Si vous chargez le singleton à partir de votre application Web, il sera isolé dans une application web unique car il est chargé par le propre chargeur de classe de la webapp. Et il sera détruit lorsque vous annulez le déploiement de la webapp. Au lieu d'arrêter votre application, vous devez annuler le déploiement.

+0

Merci, je voulais être en mesure d'arrêter et de démarrer et avoir l'application détruire le cache dans le Singleton, mais cela peut être trop d'efforts pour pas assez de gain. – Watson