2009-12-31 5 views
1
/** 
* 
*/ 
package ORM; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

/** 
* @author Gwilym 
* @version 0.0 
*/ 
public class DatabaseConnection { 

private String userName=""; 
private String password=""; 
private String host=""; 
Connection conn; 

/** 
    * @param userName 
    * @param password 
    * @param host 
    */ 
public DatabaseConnection(String userName, String password, String host) { 
    this.userName = userName; 
    this.password = password; 
    this.host = host; 
} 

public DatabaseConnection(String userName, String password, String host,boolean autoConnect) { 
    this.userName = userName; 
    this.password = password; 
    this.host = host; 
    if (autoConnect) 
    { 
    try { 
    Connect(); 
    } catch (DatabaseConnectionException e) { 
    e.printStackTrace(); 
    } 
    } 
} 

/** 
    * @return the connection 
    */ 
public Connection getConn() { 
    return conn; 
} 

/** 
    * @param userName the userName to set 
    */ 
public void setUserName(String userName) { 
    this.userName = userName; 
} 

/** 
    * @param password the password to set 
    */ 
public void setPassword(String password) { 
    this.password = password; 
} 

/** 
    * @param host the host to set 
    */ 
public void setHost(String host) { 
    this.host = host; 
} 

/** 
* Connect, attempts to connect to the MySQL database 
* with sun JDBC 
* & MySQL driver 
* @param none 
* @return True iff connected; 
* @return False for all else; 
* @throws DatabaseConnectionException 
*/ 
public boolean Connect() throws DatabaseConnectionException 
{ 
// Attempt to load database driver 
try 
    { 
     String url = "jdbc:mysql:"+host; 
     System.out.println(url); 
     //Load driver 
     Class.forName ("com.mysql.jdbc.Driver").newInstance(); 

     conn = DriverManager.getConnection (url, userName, password); 
    } 
catch (ClassNotFoundException cnfe) // driver not found 
{ 
    conn=null; 
    System.err.println ("Unable to load database driver"); 
    throw new DatabaseConnectionException(cnfe); 
} 
catch(InstantiationException ie) 
{ 
    conn=null; 
    System.err.println ("Unable to Create database driver"); 
    throw new DatabaseConnectionException(ie); 
} 
catch (IllegalAccessException iae) 
{ 
    conn=null; 
    System.err.println ("Unable to Create database driver"); 
    throw new DatabaseConnectionException(iae); 
} catch (SQLException sqle) { 
    conn=null; 
    System.err.println ("SQL error"); 
    throw new DatabaseConnectionException(sqle); 
} 

    if (conn!=null) 
    { 
     System.out.println ("Database connection established"); 
     return true; 
    } 
    else 
    { 
    System.out.println ("Database connection Failed"); 
     return false; 
    } 

} 


/** 
* Disconnects the System from the mySQL database 
* 
* @param none 
* @return true, if successful 
* @return false if not connection in existance 
*/ 
public boolean Disconnect() 
{ 
if (conn != null) 
    { 
     try 
     { 
      conn.close(); 
      conn=null; 
      System.out.println ("Database connection terminated normally"); 
      return true; 
     } 
     catch (Exception e) { 
     //Ignore these errors as they all result in conn.close anyway 
     } 
     finally 
     { 
     conn=null; 
     System.gc(); 
     // my removing the refrance to conncetion all calling the Garbage collecter we insure it is destoryed. 
     } 
     System.out.println ("Database connection terminated with errors"); 
     return true;  
    } 
else 
{ 
    System.out.println ("No Database connection present"); 
     return true;  
} 
} 




} 

Le code ci-dessus est appelé parcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException lorsque vous utilisez JDBC pour accéder à la base de données MySQL à distance

DatabaseConnection db =new DatabaseConnection("USERNAME","PASSWORD","//tel2.dur.ac.uk:3306/dcs8s07_SEG",true); 

pour des raisons évidentes, j'ai supprimé le nom d'utilisateur et mot de passe, mais ils peuvent être supposés être corrects.

Jusqu'à ce que le problème lui-même, je reçois une exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException lorsque ce code est exécuté avec les détails "Le dernier paquet envoyé avec succès au serveur était il y a 0 millisecondes. n'a reçu aucun paquet du serveur. "

Mon principal problème pour le moment est d'essayer de découvrir ce qui ne va pas. Dans la mesure où je peux dire que le pilote est chargé correctement car mon code ne lance pas une exception ClassNotFoundException, plutôt une SQLException de quelque nature que ce soit.

Donc, le problème est presque certainement la connexion d'une certaine manière. Je peux connecter et interroger cette base de données si un phpMyadmin situé sur le même serveur que je peux supposer que

1) Le serveur est en ligne 2) mySQL travaille 3) le nom d'utilisateur et mot de passe sont corrects 4) la base de données est présent et j'ai le nom correct

De cela et "Le pilote n'a pas reçu de paquets du serveur." Je me demande si l'URL a malformé?

URL = jdbc: mysql: //tel2.dur.ac.uk: 3306/dcs8s07_SEG

ou il un cadre simple qui est incorrect sur le serveur est whihc ne me permet de vous connecter?

J'ai réfléchi sur ce problème et a tenté plusieurs googles en vain, de sorte que toute idée serait d'une grande aide

merci à l'avance SO!

Répondre

3

Il s'agit d'une exception enveloppée. Quelle est la cause de cette exception? Regardez plus loin dans la pile.

Une cause racine très commune est java.net.ConnectException: Connection refused. J'ai vu cela dans près de 99% des cas. Si cela est également vrai dans votre cas, toutes les causes possibles sont:

  1. L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
  2. Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
  3. Le numéro de port est manquant ou incorrect dans l'URL JDBC.
  4. Le serveur de base de données est arrêté.
  5. Le serveur de base de données n'accepte pas les connexions TCP/IP.
  6. Quelque chose entre Java et DB bloque les connexions, par ex. un pare-feu ou un proxy.

Pour résoudre l'un ou l'autre, suivez les conseils suivants:

  1. Vérifiez et testez avec ping.
  2. Actualisez DNS ou utilisez l'adresse IP dans l'URL JDBC à la place.
  3. Vérifiez-le basé sur my.cnf de MySQL DB.
  4. Commencez.
  5. Vérifiez si mysqld est démarré sans l'option --skip-networking.
  6. Désactiver le pare-feu et/ou configurer pare-feu/proxy pour autoriser/transférer le port.

Le nom d'utilisateur et le mot de passe ne sont pas pertinents dans ce problème. À ce stade, la base de données ne peut même pas être atteinte. Vous auriez obtenu un "Echec de connexion" ou "Non autorisé" SQLException sinon.

+0

Hey Balaus J'ai quelque chose de très Causée par: java.net.ConnectException: Connection timed out: connect – Gwilym

+0

Délai de connexion dépassé usu. indique que le pare-feu bloque la communication. –

+0

hey argherna quelle fin pensez-vous? mon ordinateur ou le serveur? – Gwilym

1

En plus de la dernière publication, vous devez également effectuer un test Telnet de bas niveau. C'est le meilleur moyen de vérifier la connectivité. Ce test vous indiquera si un pare-feu ou un autre logiciel bloque l'accès à ce port.

telnet tel2.dur.ac.uk 3306

+0

J'obtiens quelques-uns des résultats intéressants que j'ai cliquetés et j'ai obtenu C: \ Users \ Panda> ping tel2.dur.ac.uk Pinging tel2.dur.ac.uk [129.234.200.251] avec 32 octets de données: La requête a expiré. La requête a expiré. La requête a expiré. La requête a expiré. Statistiques Ping pour 129.234.200.251: : Packets Sent = 4, reçu = 0, perdu = 4 (100% de perte), mais je peux acess encore phpMyAdmin sur http – Gwilym

+0

telnet tel2.dur.ac.uk La commande 3306 n'a pas fonctionné quand je l'ai mise dans le cmd – Gwilym

+0

Ensuite, il semble que le port est bloqué, avez-vous le contrôle sur cet hôte et les pare-feu qui l'entourent? – James

Questions connexes