com.mysql.jdbc.exceptions.jdbc4.CommunicationsException使用JDBC访问远程MySQL数据库时

时间:2009-12-31 19:58:56

标签: java mysql sql-server jdbc communication

/**
 * 
 */
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;    
 }
}




}

以上代码由

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

由于显而易见的原因,我删除了用户名和密码,但它们可以被认为是正确的。

直到问题本身我得到了一个com.mysql.jdbc.exceptions.jdbc4.CommunicationsException当这个代码运行时带有详细信息“成功发送到服务器的最后一个数据包是0毫秒前。驱动程序有没有从服务器收到任何数据包。“

目前我的主要问题是试图发现实际出现的问题。

到目前为止我可以告诉驱动程序正确加载,因为我的代码没有抛出ClassNotFoundException,而是抛出某种类型的SQLException。

所以问题几乎肯定是某种方式的联系。我可以通过位于同一服务器上的phpMyadmin连接和查询这个数据库,所以我可以假设

1)服务器在线 2)mySQL正在运行 3)用户名和密码是正确的 4)数据库存在,我的名字正确

从此处和“驱动程序未收到来自服务器的任何数据包”。我想知道网址是否格式错误?

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

或者服务器上有一个不正确的设置是不允许我连接的?

我一直在思考这个问题并尝试了几个谷歌无济于事,所以任何想法都会有很大的帮助

提前感谢SO!

2 个答案:

答案 0 :(得分:3)

这是一个包装异常。这个例外的根本原因是什么?在堆栈跟踪中进一步查看。

一个非常常见的根本原因是java.net.ConnectException: Connection refused。我在近99%的案例中都看到了这一点。如果在您的情况下也是如此,那么所有可能的原因是:

  1. JDBC URL中的IP地址或主机名错误。
  2. 本地DNS服务器无法识别JDBC URL中的主机名。
  3. JDBC URL中缺少或错误端口号。
  4. 数据库服务器已关闭。
  5. 数据库服务器不接受TCP / IP连接。
  6. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
  7. 要解决其中一个问题,请遵循以下建议:

    1. 使用ping验证并测试它们。
    2. 刷新DNS或在JDBC URL中使用IP地址。
    3. 根据MySQL DB的my.cnf进行验证。
    4. 启动它。
    5. 验证mysqld是否在没有--skip-networking选项的情况下启动。
    6. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。
    7. 用户名和密码与此问题无关。此时甚至无法访问DB。否则你会得到“登录失败”或“未授权”SQLException

答案 1 :(得分:1)

除了上一篇文章,您还应该进行低级别的telnet测试,这是验证连接性的最佳方法。此测试将告诉您是否存在阻止访问该端口的防火墙或其他软件。

telnet tel2.dur.ac.uk 3306