Datasource + JPA/Hibernate + C3P0 + MySQL + Tomcat

Ae pessoal.

Alguém já teve problemas ao implementar um Datasource (JNDI) com c3p0 (pool) com JPA (Hibernate) no Tomcat utilizando MySQL?
O mais engraçado é que se eu utilizar somente Datasource com JPA funciona, mas quando coloco o c3p0 não funciona mais.
Ou quando utilizo c3p0 com JPA também funciona, mas quando coloco o Datasource não funciona mais.
Parece que existe um conflito com os 3 juntos.
Acontece algumas exceções das libs do c3p0.

Aparentemente fiz tudo corretamente.


Configurei o conf/context.xml no Tomcat.

<Resource name="jdbc/site" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="admin" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://www.servidor.com.br:3306/nomebanco?autoReconnect=true" />


Configurei o web.xml da minha aplicação.

<resource-ref> <res-ref-name>jdbc/site</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>


Configurei o persistence.xml.

[code]
org.hibernate.ejb.HibernatePersistence



<-- Com datasource não funciona -->

<-- Sem datasource, e colocando as propriedades normais url, login e senha funciona -->



          <property name="hibernate.c3p0.min_size" value="1"/>
          <property name="hibernate.c3p0.max_size" value="20"/>
          <property name="hibernate.c3p0.timeout" value="30"/>
          <property name="hibernate.c3p0.idle_test_period" value="100"/>
    </properties>  

[/code]


Alguém sabe o que acontece?

Se voce esta usando um “datasource”, o Hibernate assume que o provedor destas conexoes esta fazendo pooling. Entao, ou voce usa o c3p0 com Hibernate, ou voce usa um DataSource via JNDI.

O que voce pode dar uma pesquisada eh em configurar o Tomcat para usar C3P0 para fazer o pooling, mas acho que o Tomcat ja vem com um mecanismo pra isso, baseado no DBCP. Entao, eu acho que vc pode simplesmente ignorar o C3P0 :slight_smile:

Outro detalhe: se voce especificar “hibernate.connection.datasource”, vc nao deve fornecer um usuario/senha/url. Ou voce usa um DataSource JNDI (que ja tem estas informacoes), ou voce especifica usuario/senha/url e o Hibernate gerencia as conexoes para voce (delegando para um mecanismo de connection pooling, se for o caso). Mas usar as duas taticas nao faz sentido e causa confusao, na melhor das hipoteses :slight_smile:

Obrigado partenon

Quanto as configurações do persistence.xml eu realmente não usei url/login/senha com connection.datasource, é por isso que coloquei os comentários lá.
Bem, já que não posso utilizar os 3 juntos, vou ter que descartar o Datasource, pois preciso usar o C3P0 para gerenciar as conexões do MySQL que estão sofrendo timeout.

É uma pena pois os recursos do JNDI seriam importantes, já que tenho várias fontes de acesso ao banco, Hibernate, JDBC, etc e ficar configurado login e senha em tudo vai ser uma chatisse.

Ao inves de descartar o JNDI, eu daria preferencia para descartar o C3P0. De uma lida no manual do Tomcat, pq eu tenho quase certeza que ele usa o DBCP. Entao, voce pode configurar o DBCP para cuidar das conexoes MySQL para voce :slight_smile: