【问题标题】:MySQL connection failing from constructorMySQL连接从构造函数失败
【发布时间】:2021-01-04 09:17:17
【问题描述】:

我正在尝试在我的 Java 程序和 MySQL 服务器 (root, localhost:3306) 之间创建一个连接,如果我从我的主服务器启动连接,它就会工作 Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root" ,"Password.");

但是,当我尝试从我在 Main 中调用的构造函数运行它时 bddFilmoteca newBDD = new bddFilmoteca(); 总是会报错

通讯链接故障。最后一个数据包成功接收 来自服务器的时间是 265 毫秒前。最后发送的数据包 成功到服务器是 259 毫秒前。

构造函数是:

public class bddFilmoteca {
    // Attributes for the connection:
    private static String URL = "jdbc:mysql://localhost:3306/"; 
    private static String BDD = "Filmoteca";
    private static String USER = "root";
    private static String PASSWORD = "Password.";
    private Connection con; //clase para crear una cadena de conexión al servidor o a la BD concreta 
    
    public bddFilmoteca() {
        try {
            con = DriverManager.getConnection(URL + "?useSSL=true", USER ,PASSWORD);
            try {
                crearBDD();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            
        }
    }

堆栈跟踪是:

The last packet successfully received from the server was 265 milliseconds ago.  The last packet sent successfully to the server was 259 milliseconds ago.
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
    at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:202)
    at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4869)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1656)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1217)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2189)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at bddFilmoteca.<init>(bddFilmoteca.java:16)
    at mainFilmoteca.main(mainFilmoteca.java:16)

【问题讨论】:

  • 您使用的是哪个版本的 MySQL 服务器以及哪个版本的 MySQL Connector/J?顺便说一句:如果它以"jdbc:mysql://localhost:3306/" 成功,但以"jdbc:mysql://localhost:3306/?useSSL=true" 失败,那么这应该是首先要检查的事情。该问题与在构造函数或其他地方被调用无关。
  • 试试URL + BDD + "?useSSL=true"。您可以使用单独的数据库工具来检查所有内容。

标签: java mysql jdbc constructor


【解决方案1】:

我终于找到了答案。

导致连接中断的不是对象而是我添加的 SSL=true 字符串。没有它,它会给你一个警告,但允许你连接。

【讨论】:

    【解决方案2】:

    您的代码似乎正确。不过想指出以下几点:

    1. 您要连接的数据库的名称是什么,您的 URL 没有任何数据库的名称。而不是private static String URL = "jdbc:mysql://localhost:3306/",应该是private static String URL = *"jdbc:mysql://localhost:3306/somedatabasename"
    2. 确保项目的类路径中有 MySQL Connector/J。
    3. 可能会将 Connection con 变量从私有更改为静态
    4. 检查提供的用户 ID 和密码是否输入正确。您将密码称为“密码”。结尾真的有点吗?
    5. 删除?useSSL=true后尝试,应该看起来像con = DriverManager.getConnection(URL, USER ,PASSWORD);

    按顺序尝试这些步骤。我附上了我运行的代码并且它有效:

    package stackoverflow;
    
    import java.sql.*;
    
    public class bddFilmoteca  {
        // Attributes for the connection:
        private static String URL = "jdbc:mysql://localhost:3306/mdt"; 
        private static String BDD = "Filmoteca";
        private static String USER = "root";
        private static String PASSWORD = "root";
        private static Connection con; //clase para crear una cadena de conexión al servidor o a la BD concreta 
    
        public bddFilmoteca() {
            try {
                con = DriverManager.getConnection(URL,  USER ,PASSWORD);
                //+ "?useSSL=true",
               /* try {
                    crearBDD();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }*/
            } catch (SQLException ex) {
                ex.printStackTrace();
                System.out.println(ex.getMessage());
                
            }
        }
        public static void main (String[]args) throws Exception
        {
             bddFilmoteca bdd= new  bddFilmoteca();
        Statement stmt =con.createStatement();
        String sql= "SELECT * FROM mdt.flats; ";
        ResultSet rs= stmt.executeQuery(sql);
        while(rs.next())
        {
            System.out.println(rs.getString(2));
        }
        
        
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2011-01-21
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多