Startar tomcat qndo perde a conexão com BD [RESOLVIDO]

11 respostas
cnunes

Olá amigos, bom dia!

Estou com um problema.
Toda vez que o servidor de dados é desligado (por um pique de luz, por exemplo) é necessário restartar o tomcat.
Pois a aplicação não consegue conectar o BD quando ele é restabelecido.

Existe alguma forma de restartar o tomcat automaticamente quando o servidor de BD é religado?

Att,

11 Respostas

L

Você não poderia colocar o tomcat no próprio servidor do BD não?

Isso já resolveria, porque quanda o servidor reiniciasse o serviço do tomcat também reiniciaria.

cnunes

LuanMelo:
Você não poderia colocar o tomcat no próprio servidor do BD não?

Isso já resolveria, porque quanda o servidor reiniciasse o serviço do tomcat também reiniciaria.

Olá LuanMelo,

Não tem como por causa da infra-estrutura da empresa.
O ideal seria que funcionasse na forma que está.
A aplicação em um servidor e o BD em outro.

Att,

CarvalR2

Em algum ponto do sistema ou de alguma framework, voce deve estar fazendo cache da conexão.
Tudo bem ao fazer cache, mas este cache deveria verificar se a conexao ainda está valida.

Se não estiver, o cache deveria ser limpado e novamente recarregado.
Não é um problema do tomcat, mas sim da app.

cnunes

CarvalR2:
Em algum ponto do sistema ou de alguma framework, voce deve estar fazendo cache da conexão.
Tudo bem ao fazer cache, mas este cache deveria verificar se a conexao ainda está valida.

Se não estiver, o cache deveria ser limpado e novamente recarregado.
Não é um problema do tomcat, mas sim da app.

Olá CarvalR2 ,

Estou utilizando hibernate, como posso verificar este problema na app?

Sou iniciante, não tenho muita experiência com o hibernate.

cnunes

cnunes:
CarvalR2:
Em algum ponto do sistema ou de alguma framework, voce deve estar fazendo cache da conexão.
Tudo bem ao fazer cache, mas este cache deveria verificar se a conexao ainda está valida.

Se não estiver, o cache deveria ser limpado e novamente recarregado.
Não é um problema do tomcat, mas sim da app.

Olá CarvalR2 ,

Estou utilizando hibernate, como posso verificar este problema na app?

Sou iniciante, não tenho muita experiência com o hibernate.

Alguém???

CarvalR2

Isso deve ajudar:

https://forum.hibernate.org/viewtopic.php?f=1&t=928086&view=next

cnunes

CarvalR2:
Isso deve ajudar:

https://forum.hibernate.org/viewtopic.php?f=1&t=928086&view=next

Fiquei meio perdida, pois não estou utilizando nenhum pool de conexões.

Pelo o que o CarvalR2 falou, tenho que verificar se a conexão é válida, e se não for devo reconectar.
Mas não tenho muita experiência, ainda não consegui me localizar em qual passo devo fazer esta verificação.

Segue abaixo minha classe HibernateSessionFactory, se alguém puder ajudar, agradeço.

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

    private static Configuration configuration = new Configuration();
    private static String configFile = "/hibernate/hibernate.cfg.xml";
    private static org.hibernate.SessionFactory sessionFactory;
    private static final ThreadLocal threadLocal = new ThreadLocal();

    static {

        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    public static void rebuildSessionFactory() {

        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    public static Session getSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        if (session == null || !session.isOpen()) {

            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession() : null;

            threadLocal.set(session);
        }

        return session;
    }

    public static org.hibernate.SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void setConfigFile(String configFile) {

        if (sessionFactory != null) {
            sessionFactory.close();
        }

        HibernateSessionFactory.configFile = configFile;

        sessionFactory = null;
    }

 
    public static Configuration getConfiguration() {
        return configuration;
    }
}
cnunes
cnunes:
CarvalR2:
Isso deve ajudar:

https://forum.hibernate.org/viewtopic.php?f=1&t=928086&view=next

Fiquei meio perdida, pois não estou utilizando nenhum pool de conexões.

Pelo o que o CarvalR2 falou, tenho que verificar se a conexão é válida, e se não for devo reconectar.
Mas não tenho muita experiência, ainda não consegui me localizar em qual passo devo fazer esta verificação.

Segue abaixo minha classe HibernateSessionFactory, se alguém puder ajudar, agradeço.

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

    private static Configuration configuration = new Configuration();
    private static String configFile = "/hibernate/hibernate.cfg.xml";
    private static org.hibernate.SessionFactory sessionFactory;
    private static final ThreadLocal threadLocal = new ThreadLocal();

    static {

        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    public static void rebuildSessionFactory() {

        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    public static Session getSession() throws HibernateException {

        Session session = (Session) threadLocal.get();

        if (session == null || !session.isOpen()) {

            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession() : null;

            threadLocal.set(session);
        }

        return session;
    }

    public static org.hibernate.SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void setConfigFile(String configFile) {

        if (sessionFactory != null) {
            sessionFactory.close();
        }

        HibernateSessionFactory.configFile = configFile;

        sessionFactory = null;
    }

 
    public static Configuration getConfiguration() {
        return configuration;
    }
}

Alguém?

CarvalR2

Veja só,

Realmente o BD pode ser re-startado a qualquer momento. Então em qualquer operação de banco de dados, você teria que antes validar a conexão.
Esta validação é simplesmente fazer um select no banco de dados. Exemplo: select 1

Não conheço outra forma.

Mas a cada select, update, insert, antes você teria que rodar este select de validação.
No caso de dar erro, você teria que refazer a session factory.

Mas ao invés de rodar este select 1, a sua propria operacao serve como teste de validação. Então você tem que capturar a exceção certa e caso ela aconteça, refazer a session factory… exemplo:

try {

s.insert(obj);

} catch (SQLException e ou HibernateException ) {

se codigo de erro dentro da exceção é igual a xxx, então refaz a session factory

}
cnunes

CarvalR2:
Veja só,

Realmente o BD pode ser re-startado a qualquer momento. Então em qualquer operação de banco de dados, você teria que antes validar a conexão.
Esta validação é simplesmente fazer um select no banco de dados. Exemplo: select 1

Não conheço outra forma.

Mas a cada select, update, insert, antes você teria que rodar este select de validação.
No caso de dar erro, você teria que refazer a session factory.

Mas ao invés de rodar este select 1, a sua propria operacao serve como teste de validação. Então você tem que capturar a exceção certa e caso ela aconteça, refazer a session factory… exemplo:

try {

s.insert(obj);

} catch (SQLException e ou HibernateException ) {

se codigo de erro dentro da exceção é igual a xxx, então refaz a session factory

}</blockquote>

Resolvido!!!

Capturei a exceção “org.hibernate.exception.JDBCConnectionException” e refiz a session factory.

Muito obrigada CarvalR2!

CarvalR2

Meus parabéns Chiquinha!

Pesquisou e conseguiu!

Criado 15 de junho de 2010
Ultima resposta 23 de jun. de 2010
Respostas 11
Participantes 3