qu'est-ce que java.io.EOFException, Message: ne Peut pas lire la réponse du serveur. Lire 4 octets, lire 0 octets
Cette question a été posée à quelques reprises dans la et à de nombreuses reprises dans d'autres sites. Mais je n'obtenez pas de réponse satisfaisante.
Mon problème:
J'ai une application web java qui utilise de simples JDBC pour se connecter à mysql base de données par le biais de Glassfish serveur d'application.
J'ai utilisé le regroupement de connexion au serveur glassfish avec les configurations suivantes:
Initiale De La Taille Du Pool: 25
Taille Maximale Du Pool: 100
Piscine Redimensionner Quantité: 2
Délai d'inactivité: 300 secondes
Max Temps d'Attente: 60000 millisecondes
L'application a été déployée pour les 3 derniers mois et il était en marche parfaitement aussi.
Mais à partir de 2 derniers jours, l'erreur suivante est venue au moment de la connexion.
Partielle StackTrace
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
STACKTRACE:
java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
............
............
my application traces....
Ce qui a provoqué cette erreur tout d'un coup ? J'ai perdu beaucoup de temps pour cela.
EDIT : Le problème persiste même après le redémarrage du serveur. Comme par DBA deux de la important du serveur mysql configurations sont les suivantes:
wait_timeout : 1800 secondes
connect_timeout : 10 secondes
REMARQUE : d'Autres applications déployées dans le même serveur de la connexion à la même base de données et à l'aide de différentes piscines sont en cours d'exécution en douceur.
EDIT-2 : Après avoir lu beaucoup de choses et ils s'attendaient à quelque résultat positif, j'ai fait ces changements pour mon pool de connexion.
Max Temps d'Attente : 0 (auparavant, il était de 60 secondes)
Connexion De Validation : Nécessaire
Méthode de Validation : table
Nom De La Table : Démo
Valider antérieure au plus une Fois : 40 secondes
Création Tentatives : 1
Intervalles de relance : 5 secondes
Max L'Utilisation De La Connexion : 5
Et cela a fonctionné tant que l'application est en cours d'exécution pour 3 jours de manière cohérente. Mais j'ai eu une très étrange et résultat intéressant de cette. Lors de la surveillance de la connexion de la piscine, j'ai trouvé ces chiffres:
NumConnAcquired : 44919 Compter
NumConnReleased : 44919 Compter
NumConnCreated : 9748 Compter
NumConnDestroyed : 9793 Compter
NumConnFailedValidation : 70 Compter
NumConnFree : 161 Compter
NumConnUsed : -136 Compter
Comment pouvez le NumConnFree
devenir 161 comme je l'ai Maximum Pool Size = 100
?
Comment pouvez le NumConnUsed
devenir -136, un négatif nombre ?
Comment pouvez le NumConnDestroyed
> NumConnCreated
?
- Essayez d'utiliser le même ou plus petites valeurs de délai d'attente au sein de votre application et de la base de données. Par exemple, si les demandes de délai d'inactivité est plus élevé que celui de la base de données de votre application va essayer de réutiliser une connexion qui a déjà été fermée par le serveur de base de données.
- Il aide à augmenter la piscine redimensionner la quantité? Voir la raison ici
Vous devez vous connecter pour publier un commentaire.
La connexion a échoué, peut-être due à un pare-feu idle-timeout, etc. Si vous ne disposez pas de votre pilote JDBC configuré pour se reconnecter en cas d'échec, alors cette erreur ne va pas disparaître, sauf si vous ouvrez une nouvelle connexion.
Si vous utilisez une connexion de base de données de la piscine (vous sont à l'aide de l'un, à droite?), alors, vous voulez probablement pour permettre la connexion de fonctions de vérification, comme l'émission d'une requête pour vérifier si la connexion fonctionne, avant de la remettre à disposition de l'application. Dans Apache commons-dbcp, c'est la
validationQuery
et est souvent quelque chose de simple commeSELECT 1
.Puisque vous utilisez MySQL, vous devez utiliser un Connecteur/J-spécifique "ping" requête qui est plus léger que l'émission d'un vrai requête SQL et de définir votre requête de validation de
/* ping */SELECT 1
(la partie de ping doit être exact).Il veut probablement dire que la base de données a redémarré ou le réseau de connexion à la base de données a été interrompue (par exemple, une connexion NAT a expiré) ... et votre webapp est d'essayer d'utiliser une base de données obsolète connexion.
Si le problème persiste après le redémarrage du conteneur web, il pourrait être quelque chose de plus grave.
Vous avez demandé la suivante:
Sur le visage de celui-ci, ceux-ci n'a pas de sens. Cependant, ils pourraient simplement être le résultat de certains compteurs d'utilisation mises à jour dans un non thread-safe façon. Ce n'est pas nécessairement lié à l'origine de votre problème.
C'est EndOfFileException en java, ce qui se passe quand votre curseur au point de départ est sur le point de fin ou lors de la connexion de base de données fermée en raison de certains exception inattendue.
Alors que je n'ai pas de solutions définitives, il semble que quelque chose perturbe la communication entre le serveur d'application et db. Voici quelques choses que vous pouvez essayer d'isoler le problème:
Essayer de déterminer si c'est mysql problème de code java ou problème. Essayez de vous connecter à mysql en utilisant l'outil de ligne de commande à partir de la même hôte que le serveur d'application et problème similaire SQL pour effectuer la connexion. Test à l'aide d'un simple code java qui fait de sélectionner, de le déployer pour la même infrastructure, voir ce qui se passe, etc. Vérifiez également le serveur mysql journal, voir si vous pouvez trouver quelque chose d'utile
Il y a deux façon de la connexion inactive fermé: par le pool de connexion code qui s'exécute à l'intérieur de l'app server ou mysql lui-même. Assurez-vous de vérifier la config sur les deux côtés
Vérifier si une infrastructure de réseau config a changé récemment. Une nouvelle règle de pare-feu en place interférer avec le serveur d'application <--> mysql connectivité? Y avait-il d'autres paramètres qui interdit la connexion TCP ouverte au ralenti de plus de X?
Essayez un autre pool de connexion de la bibliothèque afin d'éliminer la possibilité, c'est le regroupement de connexion
Bonne chance
Il pourrait être le Pare-feu liées problème.
J'ai eu ce problème, mais je il n'était pas possible pour moi de faire des changements dans la configuration de base de données MySQL. Donc je me suis assuré que dans mon sql connecteur de classe, la connexion est toujours fermé avant d'être lancé à nouveau. Quelque chose comme:
Et cela a résolu le problème.