# JPA und Hibernate: persistence.xml: autoReconnect=true



## spinnerudi (13. Aug 2009)

Hi

Ich setze JPA und/mit Hibernate ein.
Hibernate EntityManger Version 3.3.2.GA.
DB: MySQL 5.0.24

Mir ist bewusst, dass auf dem MySQL Server eine 'wait_timeout' konfiguriert ist.
Wenn in dieser Zeit kein DB-Zugriff passiert, loggt Hibernate beim nächsten Zugriff:

```
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was79095 seconds ago.The last packet sent successfully to the server was 79095 seconds ago, which  is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connectio
n validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
```

Allerdings habe ich im persistence.xml File folgende Konfiguration drin:
[XML]
<property name="hibernate.connection.url" value="jdbc:mysql://server/dbname?autoReconnect=true" />
<property name="hibernate.connection.autoReconnect" value="true" />
<property name="hibernate.connection.autoReconnectForPools" value="true" />
[/XML]

Was mache ich falsch?

Danke für Tipps.


----------



## spinnerudi (14. Aug 2009)

Also, ich bin nun einen Schritt weiter.

In meinem persistence.xml File habe ich alle autoReconnect Konfigurationen nun entfernt. Offenbar bringt das nichts bei einer Java Standalone App.

Jetzt ist es so:
Wenn während 'wait_timeout' (MySQL Konfiguration) kein DB Zugriff passiert oder wenn ich die Verbindung zum Testen manuell trenne, loggt Hibernate beim nächsten Zugriff immer noch dieselbe CommunicationsException (siehe Eintrag oben).

```
JDBCTransaction:67 JDBC begin failed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
```

ABER beim übernächsten Zugriff funktioniert es dann wieder, weil die Verbindung automatisch neu aufgebaut wird.

```
JDBCTransaction:54 begin
ConnectionManager:421 opening JDBC connection
DriverManagerConnectionProvider:109 opening new JDBC connection
```

Gibt es noch eine Einstellung, die ich setzen kann, damit die Verbindung schon beim 1. Fehler neu aufgebaut wird???

Danke


----------



## byte (14. Aug 2009)

Du solltest einen ConnectionPool benutzen (Apache DBCP, C3P0).


----------



## void (14. Aug 2009)

Du könntest den Parameter "testOnBorrow" auf true setzen, dann wird beim holen der Connection geprüft, ob diese noch gültig ist und ggf. eine neue aufgebaut.


----------



## spinnerudi (14. Aug 2009)

Im persistence.xml habe ich nun eingestellt:

<property name="hibernate.connection.testOnBorrow" value="true" />

Aber das bringt irgendwie nichts!?


----------



## byte (14. Aug 2009)

Ich sag doch, Du brauchst einen ConnectionPool. testOnBorrow ist ein Property vom Apache Commons DBCP...


----------



## spinnerudi (14. Aug 2009)

Ok, danke byte für die Info.

Ich werde voraussichtlich Apache DBCP verwenden.

kannst du mir vielleicht einige Tipps/Links geben, 
denn damit habe ich praktisch keine Erfahrung.

Danke!


----------



## byte (14. Aug 2009)

Einfach DBCP in den Classpath und 
	
	
	
	





```
org.apache.commons.dbcp.BasicDataSource
```
 benutzen und konfigurieren.


----------

