【问题标题】:Java wont connect to my MySQL databaseJava 无法连接到我的 MySQL 数据库
【发布时间】:2013-03-24 06:38:56
【问题描述】:

我一直在尝试连接到我的 MySQL 数据库,但它无法连接到它。运行我的应用程序时,我使用 mysql-java-connector.jar 运行它,但它仍然无法工作。

这是我使用的连接方式:

public static void createConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();//opens class
            String IP="localhost:3306";//connection ip
            String DB="SECRET";//database name
            String User="SECRET";//username
            String Pass="SECRET"; //password
            con = DriverManager.getConnection("jdbc:mysql://"+IP +"/"+DB, User, Pass); //creates connection
            stmt = con.createStatement();
        } catch (Exception e) {//catches if connection failed
            System.out.println("Connection to SQL database failed!");//tells you it failed @ the run.bat
            e.printStackTrace();
        }
    }

变量:

  public static Connection con = null;
  public static Statement stmt;
  public static boolean connectionMade;

这是我在尝试连接到我的数据库时遇到的错误:

java.sql.SQLException: Access denied for user 'daniel_voteuser'@'localhost' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)Connection to SQL database failed!

    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    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:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.rs.database.mysql.impl.Highscores.createConnection(Highscores.java:34)
    at com.rs.Launcher.main(Launcher.java:113)`

谁能帮我解决这个错误?几天来我一直在尝试解决这个问题,但我还没有成功:(

【问题讨论】:

  • 拥有该通行证的用户是否有权访问数据库?
  • 您的数据库是否允许外部连接?
  • 如何使我的数据库允许外部连接?本地主机有什么问题?我应该改变它吗?
  • 您提供的密码是否正确?从异常消息看来,登录信息不正确或数据库中不存在登录信息。
  • 是正确的,我只是删除了数据库,其他人无法登录:p

标签: java mysql connect


【解决方案1】:

异常消息描述了正在发生的事情。

这不是语法错误,而是身份验证失败的情况:您的用户-密码组合无效,或者用户没有使用数据库的权限。


可能的解决方案

步骤 1. 检查是否可以在 MySQL 控制台中使用数据库

由于您在localhost 工作,我假设您可以使用您的用户名和密码进入 MySQL。因此,在终端中:

$ mysql -h localhost -u YourUser -pYourPassword

如果失败,那么YourUserYourPassword 是错误的。如果一切顺利并且你看到 MySQL 提示符,那么试试这个:

mysql> use YourDatabase;

然后尝试一些select 查询,以确保您可以使用数据库。

第 2 步。向您的用户授予权限

如果您不能使用数据库,那么您必须授予YourUser 使用数据库的权限。以root身份登录MySQL并授予YourUser的权限:

mysql> grant all on YourDatabase.* to 'YourUser'@'localhost'

查看参考手册了解grant的用法。

希望对你有帮助

【讨论】:

  • 我怎样才能让我的数据库允许连接?
  • @DekuleguttaHeisann 检查我的编辑:它显示了一个可能的解决方案
  • 嘿,我试着照你说的做,但现在我遇到了另一个问题......我无法再连接到我的数据库了:/ 错误 1045 (28000): Access denied for user 'SECRET'@'localhost '(使用密码:YES)
  • @DekuleguttaHeisann 那么您的用户名和密码有问题。请记住,两者都区分大小写。也许您的解决方案是以 root 身份输入 MySQL 并重置用户密码。查看参考手册以了解如何管理 MySQL 用户帐户。
  • @DekuleguttaHeisann 如果您无法以 root 身份登录,那么您必须要求您的系统管理员以 root 身份登录并重置密码。
【解决方案2】:

您可以尝试以下语法来创建连接作为替代:

con = DriverManager.getConnection("jdbc:mysql://"
    + MYSQL_SERVER + ":3306" + "/" + MYSQL_DB_NAME 
    + "?user=" + MYSQL_USERNAME
    + "&password=" + MYSQL_PASSWORD);

【讨论】:

  • 好的,那么很可能是用户名/密码问题。
  • 不,这不可能,因为我已经测试了与 MySQL Workbench 5.2 CE 的连接,并且当我使用它连接到数据库时它工作正常。只有Java,我无法连接到它...
  • 密码中是否有特殊/异国情调的字符? (反斜杠等)尝试更改密码。或者你可以试试 String IP="127.0.0.1:3306";而不是 localhost 甚至 String IP="address=(protocol=tcp)(host=::1)(port=3306)";处理通过 IPv6 的访问。
【解决方案3】:

这是我成功使用的方法:

public void connectToDatabase( String username, String password, String lastname)
{
    Connection connection = null;
    String url = "jdbc:mysql://localhost:3306/javabase";
        try 
        {
            System.out.println("Connecting database...");
            connection = DriverManager.getConnection(url, username, password);
            System.out.println("Database connected!");
            Statement stmt = connection.createStatement();
            String query = "select firstname from user where lastName like \"" + lastname + "\"";
            ResultSet rs = stmt.executeQuery(query);

            int columns = rs.getMetaData().getColumnCount();
                    message = new StringBuilder();

                    while (rs.next()) 
                    {
                    for (int i = 1; i <= columns; i++) 
                    {
                            message.append(rs.getString(i) + " ");
                    }
                    message.append("\n");
                    }

                    System.out.println(message);  // print table contents          
        } 
        catch (SQLException e) 
        {
            throw new RuntimeException("Cannot connect the database!", e);
        }       
        finally 
        {
            System.out.println("Closing the connection.");
            if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
        }

我通过不同的方法传递用户名、密码和查询内容,但您可以在适合您的任何地方定义它们。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2018-02-06
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多