Singleton de um SessionFactory em app web

E aí moçada, to quase concluindo minha primeira aplicação web comercial em java, bom, sei que a maioria aqui vai meio que contra, mas eu a desenvolvi usando o Struts :), usei o hibernate para fazer a persistencia, utilizando o pattern DAO, daí na minha ignorancia o que to fazendo, estou instanciando um SessionFactory para cara DAO, e isso pelo que li, e agora estou sentindo na pele, torna o sistema lento, como eu posso fazer isso apenas quando o tomcat iniciar ou pelo menos no primeiro acesso a aplicação? Já tentei fazer um tal de “listener” no tomcat, mas não entendo como resgatar esse objeto instanciado, será que alguém poderia me dar uma força, me explicando o funcionamento desse tipo de funcionalidade? como por exemplo, onde ir buscar esse objeto instanciado, ou se isso não é a melhor solução me dar uma dica de como fazer algo melhor.

Até mais,

Eduardo

Duas entre outras opções:

  1. use IoC. Vai ficar lindo e fácil de manter. Como você faz isso com Struts eu não sei, se ele não faz (@.@) use algum outro IoC Container.

  2. Faça isso:

class CriadorDeSessionFactory {
    private static SessionFactory factory;

    private CriadorDeSessionFactory() {}

    public SessionFactory getInstance() {
        if( factory == null ) {
            // inicializa a factory
        }

        return factory;
    }
}

class MyAction extends Action {
    public ActionForward execute( /* 2457 objetos complexos e muitas vezes desnecessários */) throws Exception {
        DAO myDao = new MyDao( CriadorDeSessionFactory.getInstance() );
    }
}

Só completando a resposta do LIPE…
vc pode iniciar o seu SessionFactory e deixá-lo como Static… para fazer isso na inicialização do Tomcat, edite o arquivo web.xml e ponha algo assim

<servlet-name>SeuServlet</servlet>
<load-on-startup>0</load-on-startup>

A segunda linha que é a responsável por carregar o seu servlet quando o tomcat for iniciado

valeu moçada, mas ainda tenho uma dúvida (tô devagar hein?), ManchesterR, como eu faço dentro da minha aplicação o acesso a esse objeto “SeuServlet” tipo:

  class MyAction extends Action {

    public ActionForward execute( /* 4 objetos complexos e muitas vezes desnecessários */) throws Exception {

       SessionFactory sf = seuServlet.getSessionFactory(); //instancia de SeuServlet

    }

  }

:?:

Nossa, caiu a ficha, quando o atributo é estático então a VM reserva espaço para ele na memória, depois é só acessar de forma estática que ele não será carregado novamente…

:oops: