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

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,

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.

[quote=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.[/quote]

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,

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.

[quote=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.[/quote]

Olá CarvalR2 ,

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

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

[quote=cnunes][quote=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.[/quote]

Olá CarvalR2 ,

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

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

[/quote]

Alguém???

Isso deve ajudar:

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

[quote=CarvalR2]Isso deve ajudar:

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

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

[quote=cnunes][quote=CarvalR2]Isso deve ajudar:

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

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.

[code]
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;
}

}

[/code][/quote]

Alguém?

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
}

[quote=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
}[/quote]

Resolvido!!!

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

Muito obrigada CarvalR2!

Meus parabéns Chiquinha!

Pesquisou e conseguiu!