【问题标题】:JDBC + MYSQL Communications link failureJDBC + MYSQL 通信链接失败
【发布时间】:2015-03-20 08:59:57
【问题描述】:

我肯定做错了什么,或者我错过了什么但不知道那是什么。我安装 XAMPP Apache/MYSQL。我在本地连接,一切正常。我尝试更进一步并获得对数据库的远程访问。

问题

  1. 当我在浏览器中键入 myip/xampp 时,我只看到“连接已重置”,但其他人都可以吗? (Xampp 欢迎页面)

  2. 以前工作时无法通过 JDBC error com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 连接,只能更改主机名。

这是代码。

public DBConnect(String whichDataBase){
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+whichDataBase+"?characterEncoding=UTF-8","monty","some_pass");
        st = con.createStatement();
    } catch (Exception e) {
        System.out.println("error "+e);}
}

在数据库状态选项卡上,它看起来像“连接?” (见 host but command=sleep 并在上面的 java 中出现错误)。但是当我使用 VPN 时,它的连接和工作正常吗? o_O

我做过的事情

  • 在路由器上转发 80 和 3306 端口(在 http://www.yougetsignal.com/tools/open-ports/ 上测试)

  • socket = "TCP/IP" 更改为my.ini

  • 注释掉#enable-named-pipe#skip-networking

  • bind-address="0.0.0.0"(另请查看127.0.0.1

  • 数据库用户在localhost% 上获得所有特权和授权

我是初学者,感谢您的帮助!

编辑:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:338)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2232)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2064)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:790)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:395)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at DBConnect.<init>(DBConnect.java:17)
at Poro.actionPerformed(Poro.java:297)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.contentsChanged(Unknown Source)
at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
at javax.swing.DefaultComboBoxModel.addElement(Unknown Source)
at javax.swing.JComboBox.addItem(Unknown Source)
at Poro.<init>(Poro.java:231)
at Poro.main(Poro.java:287)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:213)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:297)
... 24 more

【问题讨论】:

  • 显示整个异常。
  • 但是当我使用 VPN 时,它的连接和工作正常吗? 数据库是否可以直接从您的网络访问,或者您是否必须使用 VPN?
  • @Jens 这是整个例外吗? xD,我一直在其他笔记本电脑上使用 VPN 来检查我是否可以连接
  • @Michael 不,不是。使用 e.printStacktrace()
  • 嗨@Michael,你有没有想办法解决它?我遇到了同样的问题。谢谢!

标签: java mysql jdbc


【解决方案1】:

尝试以这种方式进行:

public class MysqlConnect {

    static String template = "jdbc:mysql://localhost/%s?useEncoding=true&characterEncoding=UTF-8&user=%s&password=%s";

    public void connect(String database, String user, String password) {

        Connection conn = null;

        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(String.format(template, database, user, password));
            //...
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

所以调用Class.forName("com.mysql.jdbc.Driver").newInstance() 并将usernamepassword 添加到您的连接字符串中。

还要检查这个:Connecting to MySQL Using the JDBC

【讨论】:

  • 改变你的方式。不幸的是,仍然没有发生同样的错误。
  • @Michael 你能通过控制台访问你的数据库吗?你确定mysql数据库正在运行吗
  • 是的,我可以连接。数据库运行
【解决方案2】:

我有同样的错误。我已经尝试过这种方式(修改dit的答案代码),它对我有用:

public class SqlConnection {
    static String template = "jdbc:mysql://localhost/%s?useEncoding=true&characterEncoding=UTF-8&user=%s&password=%s";

    public static Connection dbConnector() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection(String.format(template, <database-name>, <username>, "password"));
            System.out.println("Connected succesfully");
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

注意:您必须在DriverManager 中修改database-nameusernamepassword。 getConnection 方法。 最后,您可以调用:

SqlConnection.dbConnector();

现在,我可以看到“已连接成功”。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2018-03-05
    • 2012-12-21
    • 2021-01-12
    • 2015-01-27
    • 2014-09-10
    • 2014-06-09
    • 2016-09-25
    相关资源
    最近更新 更多