Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JDBC MySQL automatically converts localhost to 127.0.0.1

Tags:

java

mysql

jdbc

I am trying to connect to MySQL from JDBC via localhost. But the connection fails. In the exception, I see that JDBC is trying to connect to 127.0.0.1

    String connectionString = "";
    try {
        loadProperties();
        Class.forName("com.mysql.jdbc.Driver");
        // Setup the connection with the DB
        connectionString = "jdbc:mysql://" + properties.getProperty("host") + "/" + properties.getProperty
                ("database") + "?user=" + properties.getProperty("user") + "&password=" + properties
                .getProperty
                        ("password");
        connect = DriverManager
                .getConnection(connectionString);
        logger.debug("Connected to " + properties.getProperty("host"));
    } catch (Exception e) {
        logger.error("Database Connection failed with connection string - " + connectionString,e);
    }

From the log:

Database Connection failed with connection string - jdbc:mysql://localhost/testdb?user=testuser&password=testpass

java.sql.SQLException: Access denied for user 'testuser'@'127.0.0.1' (using password: YES)

Why is it replacing localhost with 127.0.0.1? I have configured login only for localhost.

like image 677
Lenin Raj Rajasekaran Avatar asked Sep 17 '25 05:09

Lenin Raj Rajasekaran


1 Answers

I stumbled across this question when encountering the same issue.

To answer the question "Why is it replacing localhost with 127.0.0.1?":

From the MySQL docs, using localhost in your connection URL implies that you want to connect to a socket. Using 127.0.0.1 implies that you want to connect through TCP/IP.

On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. ... To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1

According to this answer, it appears that by default JDBC only supports TCP/IP connections, at least for some Java versions. Original source: http://lists.mysql.com/java/8749:

Java itself doesn't support unix domain sockets

So, I'd guess that since JDBC only connects through TCP/IP, it converts localhost to 127.0.0.1 internally.

To solve the problem in my case:

  • I granted permission in MySQL for [email protected]
  • I changed localhost to 127.0.0.1 in my connection URL.
like image 98
kentr Avatar answered Sep 18 '25 18:09

kentr