La perte de connexion à MySQL après un certain temps, et pas de la reconnexion
Je suis le développement d'un serveur autonome qui utilise JPA+Hibernate pour accéder à une base de données MySQL.
Quand je lance le serveur, tout fonctionne bien. Cependant, après un certain temps (généralement le lendemain matin, si je le commence dans l'après-midi), il s'arrête de travailler parce qu'apparemment la connexion à MySQL a été fermé (je vois beaucoup de SocketException
s dans les journaux). Ceci est probablement causé par la marche au ralenti, le serveur est en cours de développement et personne ne l'utilise la nuit.
Je pensais que Hibernate, JDBC ou d'une autre couche en dessous de mon application serait de gérer la connexion et la rouvrir si nécessaire, mais apparemment pas. Est-il un paramètre de configuration j'ai raté?
persistence.xml
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="manager">
<class>example.data.entities.User</class>
<class>example.data.entities.Player</class>
<properties>
<property name="hibernate.dialect" value="example.data.HibernateDialect" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
</properties>
</persistence-unit>
EntityManagerFactory
création
log.info("Connecting to database @ " + dbUrl + " using " + dbUser + "/" + dbPass);
emf = Persistence.createEntityManagerFactory("manager", Maps.create(
"javax.persistence.jdbc.user", dbUser,
"javax.persistence.jdbc.password", dbPass,
"javax.persistence.jdbc.url", dbUrl
));
Une requête
try
{
TypedQuery<User> q = em.createQuery("SELECT u FROM User u WHERE u.email = :mail", User.class);
q.setParameter("mail", email);
try {
u = q.getSingleResult();
log.info("Authenticating: " + u);
} catch (NoResultException e) {
return false;
}
} finally {
em.close();
}
Vous devez vous connecter pour publier un commentaire.
Comme vous le suggérez, c'est parce que mysql ferme les connexions inactives après chaque
wait_timeout
passe, vous avez quelques options de travailler autour de votre problème:wait_timeout
dans mysql assez grand pour votre cas d'utilisation (la valeur par défaut est de 8 heures).pilote mysql prend en charge autoReconnect
l'url jdbc va ressembler
jdbc:mysql://localhost/bms_company?autoReconnect=true
si u suspect mysql est de bloquer les connexions
Essayez d'ajouter les entrées suivantes à la fin de MySQL est mon.fichier ini. Ce fichier
est situé dans l'installation de MySQL racine du dossier.
#Le nombre de secondes que le serveur mysqld est en attente pour se connecter paquet
avant de répondre avec un "Mauvais poignée de main'
connect_timeout=0
#Le nombre de secondes que le serveur attend une activité interactive
connexion avant de le fermer.
interactive_timeout=2000000
#Le nombre de secondes que le serveur attend une activité sur une connexion avant
fermeture
wait_timeout=2000000
--Kiran.Kumar