hibernate - reconectar conexão quando o banco reiniciar, tomcat
Perguntas � hibernate � reconectar conexão quando o banco reiniciar, tomcat
reconectar conexão quando o banco reiniciar, tomcat
Tenho um problema em uma aplicação, ela é uma Servlet, a qual faz uso do banco de dados, para pegar informações e levar aos clientes que consomem a Servlet. No ambiente onde está o banco de dados, pode acontecer de haver manutenção no banco de dados, precisando parar e iniciar novamente o mesmo, e quando após ele ter iniciado, eu executar a Servlet, ocorre problemas com a sessão do banco de dados, dizendo que a mesma está fechada, fiz uma implementação provisória, que a cada vez que é requisitada uma seção, ele tenta fazer um simples select no banco "select 1 from dummy" e executa esta query, caso aconteça algum erro, ele monta a SessionFactory novamente, gostaria de saber se há alguma maneira mais elegante de fazer isto, estou usando Hibernate, e como servidor de aplicação o Tomcat.
se sua duvida foi resolvida, por favor não deixe de marca a resposta que mais de ajudou como correta para poder ajudar outras pessoas...
— Cristian Urbainski 03 de jun de 2013
Acho que o melhor a fazer é usar JNDI e deixar o tomcat tomar conta das conexões pra vc. Segue thread do stackoverflow que explica todos os arquivos que devem ser criados, vide primeira resposta: http://stackoverflow.com/questions/5303671/configure-hibernate-to-connect-to-database-via-jndi-datasource
depois de uma pesquisa no google achei esse link
http://www.tera-rocker.com/pentaho-bi-server-perda-de-conexao-mysql
nesse link o autor conta uma historia parecida com a sua, e relata que apos muitas pesquisas encontrou a solucao para isso, a bibliotece c3p0 do hibernate la ele mostra a configuracao algo mais ou menos assim
<property name="hibernate.c3p0.idle_test_period">10</property>
<property name="hibernate.c3p0.max_size">75</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1</property>
da uma lida no tutorial, e teste espero que funcione como dsejas...
pelo que vi isso tambem é importante, portanto deve ser colocado o autoReconect desta forma
— Cristian Urbainski 09 de mai de 2013
companheiro marque a resposta como correta para finalizarmos o post
— Cristian Urbainski 22 de set de 2013
Faça a conexão usando JNDI dataSource:
<Resource auth="Container" name="jdbc/jndi-hibernate"
driverClassName="com.mysql.jdbc.Driver" maxActive="20" maxIdle="10"
maxWait="-1" type="javax.sql.DataSource" url="jdbc:mysql://localhost/vraptorJndiHibernate"
password="xxx" username="root" validationQuery="SELECT 1"
timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="60000" />
<res-ref-name>jdbc/jndi-hibernate</res-ref-name>
<property name="hibernate.connection.datasource">java:/comp/env/jdbc/jndi-hibernate</property>
<mapping class="net.gregio.hibernate.model.Pessoa" />
No pom.xml coloque a dependencia como provided
Coleque o driver do mysql na pasta libs do tomcat.
E se, ao invés de você fazer o teste, executa a instrução e, em caso do erro específico (sessão fechada), você recria a sessão e tenta novamente executar a instrução?
Boa idéia, colocar em um bloco protegido, e caso acontecer algum erro, fazer um loop, esperando alguns segundos e tentando novamente até que funcione, acredito que vai ficar bom.
— Eduardo Vendruscolo 09 de mai de 2013
mas vou tentar fazer isto no aonde eu pego a sessão mesmo, por que se eu fizer em cada lugar que utiliza alguma sessão não vai ficar legal, acho que não vou escapar de fazer um teste prévio de conexão.
Essa não é a melhor opção, eu faria igual ao link que o nosso amigo @fredferrao indicou. Fora que essa solução não resolve o seu problema!