Erreur de Connexion MySQL lors de l'accès à un serveur distant
J'ai hébergé une DB MySQL dans un serveur web. J'ai accordé à tous les privilèges augmentés par rapport et a permis mon IP pour se connecter à cette base de données à distance de mon ordinateur local. Il obtient connecté et je suis capable de récupérer des données à partir de la base de données de mon application Java Swing. Mais, parfois, j'obtiens ce message d'erreur et mon connexion avec le hébergé DB échoue.
L'erreur est indique ci-dessous:
Apr 7, 2012 12:49:20 AM scm.new_fas txtSearchKeyReleased
SEVERE: null
com.mysql.jdbc.CommunicationsException: 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:3250)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3179)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1207)
at scm.DBControl.getResult(DBControl.java:49)
at scm.new_fas.txtSearchKeyReleased(new_fas.java:1686)
at scm.new_fas.access$2300(new_fas.java:28)
at scm.new_fas$23.keyReleased(new_fas.java:1136)
at java.awt.Component.processKeyEvent(Component.java:5999)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2794)
at java.awt.Component.processEvent(Component.java:5815)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
at java.awt.Component.dispatchEventImpl(Component.java:4282)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
** END NESTED EXCEPTION **
Last packet sent to the server was 2 ms ago.
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2622)
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:3250)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3179)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1207)
at scm.DBControl.getResult(DBControl.java:49)
at scm.new_fas.txtSearchKeyReleased(new_fas.java:1686)
at scm.new_fas.access$2300(new_fas.java:28)
at scm.new_fas$23.keyReleased(new_fas.java:1136)
at java.awt.Component.processKeyEvent(Component.java:5999)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2794)
at java.awt.Component.processEvent(Component.java:5815)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
at java.awt.Component.dispatchEventImpl(Component.java:4282)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Quelqu'un peut-il m'aider avec cette situation. Je ne comprends pas ce qui est faux! C'est le serveur ou ?
Merci beaucoup 🙂
C'est ma classe pour se Connecter à la DB:
package scm;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBControl {
private static DBControl con;
private static String severIp = null;
private static String severPort = null;
private static String userName = null;
private static String password = null;
private static ResultSet rs = null;
private static Connection cc = null;
public DBControl() {
}
public static synchronized DBControl getInstance() {
if (con == null) {
con = new DBControl();
}
return con;
}
public void setSeverIp(String Ip) {
severIp = Ip;
}
public void setSeverPort(String Port) {
severPort = Port;
}
public void SetUserName(String Name) {
userName = Name;
}
public void setPassword(String passWord) {
password = passWord;
}
public static ResultSet getResult(String url) throws Exception {
Statement s = cc.createStatement();
rs = s.executeQuery(url);
return rs;
}
public static Connection getConnection() throws Exception {
// try {
Class.forName("com.mysql.jdbc.Driver");
cc = (Connection) DriverManager.getConnection("jdbc:mysql://" + getSeverIp() + ":" + getSeverPort() + "/anuradha_rr", getUserName(), getPassword());
return cc;
}
public void setResult(String url) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
cc = (Connection) DriverManager.getConnection("jdbc:mysql://" + getSeverIp() + ":" + getSeverPort() + "/anuradha_rr", getUserName(), getPassword());
Statement s = (Statement) cc.createStatement();
s.executeUpdate(url);
}
public static String getSeverIp() {
return severIp;
}
public static String getSeverPort() {
return severPort;
}
public static String getUserName() {
return userName;
}
public static String getPassword() {
return password;
}
}
OriginalL'auteur wishman | 2012-04-06
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que vous n'êtes pas à l'aide d'un mort connexion jdbc. En fonction de comment vous la création de votre connexion jdbc ils ont peut-être ralenti. Si vous êtes en utilisant la même connexion, tester la connexion avant de vous essayez d'exécuter une requête et obtenir un nouveau si elle a été fermée par mysql.
Mise à JOUR:
Vous créez une nouvelle connexion partout, sauf getResult (), qui est l'endroit où la trace de la pile à identifier l'erreur vient de. Vous pouvez soit créer une nouvelle connexion, comme partout ailleurs, ou d'améliorer l'encapsulation de getConnection(). En d'autres termes, le changement getConnection() pour renvoyer la statique de Connexion stockées dans votre classe, à condition qu'il n'est pas null et toujours valide. Sinon, créer une nouvelle connexion et de retour que.
Êtes-vous en invoquant la connexion directement ou à l'aide d'une abstraction de base de données de l'outil? Si vous êtes en invoquant la java.sql.Connexion directement, essayez de le isValid(int timeout) de la méthode.
J'ai juste modifié ma question et ajouté ma classe pour se connecter à la DB. Pouvez vous s'il vous plaît avoir la gentillesse de le vérifier et me dire où je dois le corriger ? Merci beaucoup 🙂
Je sais, je n'ai pas de créer une nouvelle connexion à getResult() depuis sa lente lors de la récupération de données à partir de la DB, par la création d'une nouvelle connexion pour chaque résultat. Je pense que le problème est que le serveur déconnecte , comme un délai d'attente. N'est-il pas un moyen de garder la connexion, sans laisser le serveur pour déconnecter? Comme constante la commande ping ?
L'idéal consisterait à utiliser le regroupement de connexion pour résoudre ce problème. Ainsi, votre code permettrait de maintenir un nombre de connexions et l'utilisation d'une simple requête rapide pour les garder en vie s'ils avaient été inactif pendant un certain laps de temps (et de remplacer expiré connexions lorsque nécessaire). Toutefois, si vous allez à présent code dans votre classe, vous êtes en danger de ré-inventer la roue pour ainsi dire. Pourquoi ne pas vous regarder dans une abstraction de base de données de l'outil pour gérer les connexions pour votre? la norme de l'industrie est mise en veille prolongée(hibernate.org), mais ce n'est pas le seul outil disponible pour vous.
OriginalL'auteur Dave
C'est un problème assez courant dans MySQL, malheureusement, se produisant habituellement seulement après dans la production lorsque l'application s'exécute pendant un certain temps prolongé à la différence sur le court cycle de développement.
MySQL ferme les connexions sans en avertir ses clients et la pas bien de raconter exception est ce qui s'affiche lorsque vous essayez d'utiliser un temps de connexion. vous pourriez, par exemple, de ping la connexion avec certains trivial instruction SQL régulièrement pour éviter délai d'attente.
C'est une bonne pratique d'utiliser un pool de connexion (pour éviter des problèmes avec un trop grand nombre d'utilisateurs accédant à l'DB à la fois), par exemple, DBCP, en général. DBCP peut être ajouté à votre application facilement et vous ne réglez-le comme un quasi pilote JDBC.
De là, vous pouvez régler les choses de manière correcte.
J'ai copié ce DBCP config à partir de l'un de mes projets:
Mise à jour:
Comme une solution très simple, vous pouvez essayer d'attraper l'exception de l'accès et ouvrir une nouvelle connexion dans ce cas.
OriginalL'auteur MarianP