[RESOLVIDO] PostgreSQL não conecta, com hibernate - jpa - spring roo

Bom dia pessoal,

Estou desenvolvendo uma aplicação aqui no trabalho onde preciso me conectar com um BD Postgres. O BD é bem grande, com diversos databases e schemas. Criei uma aplicação de teste pequena com os seguintes arquivos:

EspécieVeiculo.java

[code]@RooJavaBean
@RooToString
@RooJpaActiveRecord(identifierColumn = “id_especie_veiculo”, table = “especie_veiculo”,
versionField = “”, schema=“transporte”)
@RooJson
public class EspecieVeiculo {

private String denominacao;

}[/code]

Persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.hbm2ddl.auto" value="validate"/> <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> <property name="hibernate.connection.charSet" value="UTF-8"/> </properties> </persistence-unit> </persistence>

database.properties

database.driverClassName=org.postgresql.Driver database.username=user database.password=password database.url=jdbc:postgresql://host_remoto:5432/administrativo_homologacao

applicationContext.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <context:property-placeholder location="classpath*:META-INF/spring/*.properties"/> <context:spring-configured/> <context:component-scan base-package="br.gov.dprf.testes"> <context:exclude-filter expression=".*_Roo_.*" type="regex"/> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan> <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> <property name="driverClassName" value="${database.driverClassName}"/> <property name="url" value="${database.url}"/> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> <property name="testWhileIdle" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="1800000"/> <property name="numTestsPerEvictionRun" value="3"/> <property name="minEvictableIdleTimeMillis" value="1800000"/> </bean> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="persistenceUnit"/> <property name="dataSource" ref="dataSource"/> </bean> </beans>

O problema é o seguinte: quando mando conectar ao servidor, ele fica travado tentando conectar, sem obter nenhuma resposta. Nunca sai da tentativa de conexão.
Fiz alguns testes:

  • Coloquei o nome do database errado. Ele informou que estava errado. Isso indica que está conseguindo conexão com o BD, pelo menos pra checar os nomes;
  • Fiz um banco parecido na minha máquina e tentei conectar nela, mudando só o ip no database.properties. Conectou sem problemas;
  • Criei uma app com o velho JDBC pra conectar no servidor. Funcionou 100%.

Parece que a aplicação se perde quando conecta no servidor. Em conversa com o DBA daqui, ele disse que o log gerada é bem sem noção, com a aplicação consulta vários catálogos do postgres e umas tabelas de sistema. Depois de um monte de consulta, ela para.
Alguém já passou por algo parecido?

comente o bean atual do dataSource

e deixe esse

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> <property name="driverClassName" value="${database.driverClassName}"/> <property name="url" value="${database.url}"/> </bean>

vê se agora vai …teste simples esse

[quote=tmvolpato]comente o bean atual do dataSource

e deixe esse

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> <property name="driverClassName" value="${database.driverClassName}"/> <property name="url" value="${database.url}"/> </bean>

vê se agora vai …teste simples esse[/quote]

Fiz o teste, mas ainda não funcionou. Pelo menos agora ele dá mensagem de erro de timeout, antes nem isso dava.
Obrigado!

[quote=bruno.gabrielli][quote=tmvolpato]comente o bean atual do dataSource

e deixe esse

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> <property name="driverClassName" value="${database.driverClassName}"/> <property name="url" value="${database.url}"/> </bean>

vê se agora vai …teste simples esse[/quote]

Fiz o teste, mas ainda não funcionou. Pelo menos agora ele dá mensagem de erro de timeout, antes nem isso dava.
Obrigado![/quote]

e no log aparece o que?

O log do BD eu não sei, porque o DBA só volta ao trabalho às 14h. De tarde vou ver se faço um teste com ele monitorando o log.

não no bd

no log do eclipse fica na aba [Console]
deve está mostrando alguma coisa lá
assim poderemos resolver o problema mais rápido

Pelo visto a questão de dar timeout e mensagem de erro foi só temporária… Agora não tá dando mais heheh
Voltou a ficar por muito tempo sem retorno. Deviam estar mexendo no banco naquele momento.

As exceções que davam eram só de timeout mesmo.

Deixei a aplicação rodando aqui e ela conectou. Quando fui olhar o log, deu 21 MINUTOS para conectar… incrível isso hehehe

Fiz um novo teste aqui, configurando o log do driver para DEBUG.
É assustador. Ele faz uma checagem de todas as tabelas, sequências etc do BD. Como o banco é gigante, são muitos minutos de log correndo.

Os logs dão dessa maneira:

02:07:55.214 (2) simple execute, handler=org.postgresql.jdbc2.AbstractJdbc2Statement$StatementResultHandler@357ff62f, maxRows=0, fetchSize=0, flags=16 02:07:55.214 (2) FE=> Bind(stmt=S_1,portal=null,$1=<'pg_statio_user_indexes'>) 02:07:55.214 (2) FE=> Execute(portal=null,limit=0) 02:07:55.214 (2) FE=> Sync 02:07:55.214 (2) <=BE BindComplete [null] 02:07:55.214 (2) <=BE DataRow 02:07:55.214 (2) <=BE CommandStatus(SELECT 1) 02:07:55.214 (2) <=BE ReadyForQuery(I)

Alguém sabe como evitar essa superchecagem do Postgres+Hibernate? Repito que com JDBC padrão tem funcionado rapidinho.

Problema resolvido. Para a aplicação não ficar tentando consultar todos os metadados do BD, basta colocar a seguinte linha no persistence.xml:

<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />

Fica a dica.
Obrigado pela ajuda.