Carregando SessionFactory na inicialização do Tomcat

Guj´s

Estou implementando um servlet para que possa carregar a SessionFactory do hibernate logo na inicialização do tomcat o que reduz significativamente o tempo do primeiro acesso na minha aplicação pelos usuários, pois bem, criei uma classe HibernateUtil dessa forma:

public class HibernateUtil {

    private static Configuration     configuration;
    private static SessionFactory    sessionFactory;
    private static final ThreadLocal threadSession       = new ThreadLocal();

    private static final String      ERR_SESSION_FACTORY = "Erro criando a session factory";

    static {
        try {
            configuration = new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
        } catch (HibernateException he) {
            SystemLog.error(ERR_SESSION_FACTORY, he);
        }
    }

   ...

a aplicação está funcionando “normalmente” porém notei que na inicialização do Tomcat é lançada sempre essa excessão:

java.lang.ClassCastException: br.com.sperto.dao.hibernate.HibernateUtil
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:925)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3857)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4118)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
	at org.apache.catalina.core.StandardService.start(StandardService.java:450)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:683)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:537)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:271)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:409)

e aqui está o meu web.xml:

<?xml version="1.0" encoding="UTF-8"?>

&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;

&lt;web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;

	&lt;display-name&gt;Sperto Server&lt;/display-name&gt;

	&lt;listener&gt;
		&lt;listener-class&gt;
			org.apache.axis.transport.http.AxisHTTPSessionListener
		&lt;/listener-class&gt;
	&lt;/listener&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		&lt;display-name&gt;Apache-Axis Servlet&lt;/display-name&gt;
		&lt;servlet-class&gt;
			org.apache.axis.transport.http.AxisServlet
		&lt;/servlet-class&gt;
	&lt;/servlet&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;hibernate&lt;/servlet-name&gt;
		&lt;servlet-class&gt;
			br.com.sperto.dao.hibernate.HibernateUtil
		&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/servlet/AxisServlet&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;filter&gt;
		&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
		&lt;filter-class&gt;
			br.com.sperto.util.hibernate.HibernateFilter
		&lt;/filter-class&gt;
	&lt;/filter&gt;

	&lt;filter-mapping&gt;
		&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;

	&lt;session-config&gt;
		&lt;session-timeout&gt;5&lt;/session-timeout&gt;
	&lt;/session-config&gt;

	&lt;mime-mapping&gt;
		&lt;extension&gt;wsdl&lt;/extension&gt;
		&lt;mime-type&gt;text/xml&lt;/mime-type&gt;
	&lt;/mime-mapping&gt;

	&lt;mime-mapping&gt;
		&lt;extension&gt;xsd&lt;/extension&gt;
		&lt;mime-type&gt;text/xml&lt;/mime-type&gt;
	&lt;/mime-mapping&gt;

	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
		&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;
		&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
		&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;
		&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;
		&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;
&lt;/web-app&gt;

Onde pode estar o problema de Cast aí, pois estou usando sdk-1.5?

[]´s

Acredito que isto ocorra porque seu HibernateUtil não é um servlet.

Há alguma forma de contornar essa exception? Criar um servlet que implemente essa classe talvez?

Se voce criar um servlet para implementar isso irá funcionar. Ai vai a dica de como eu faço isso.

Eu tenho uma classe chamada DAO, que irá ter alguns métodos padrões para outros DAOs que irão extender ela, dentro desse DAO eu tenho um método chamado start(), que inicia o SessionFactory e deixa ele static.
Crio um Serlvet chamado Initialization(), que dentro do seu método init() ele “starta” o DAO

DAO dao = new DAO();
dao.start();

E funciona perfeitamente :wink:

Espero ter ajudado

Valew ManchesterR! Funfou direitinho aqui!

Aproveitando o encejo, estou trabalhando com WebServices nesta mesma aplicação e na outra ponta uma aplicação Delphi irá acessar meus métodos, a pergunta é sobre a segurança de quem pode ou não acessar, ou seja, como posso tratar se a requisição está vindo de um cliente (quente) digamos assim… Pensei em trafegar um id criptografado entre as pontas em todas as requisições mas será que vale a pena todo este esforço? afinal todos os meus métodos teriam que ser reimplementados para aceitar sempre este id e tratar correto!

Alguma sugestão??

Acho q ai a seguranca pode ser feita na camada de rede, seja com uma restricao por sub-rede ou entao um https ou outra solucao. Mas eh na camada de rede, tome isso como uma pre-condicao e como requisito nao funcional, a aplicacao deve acessar o webservice X por um canal seguro.

[]s

:slight_smile: