【问题标题】:New version of my spring boot app's can't connect to mysql我的新版 Spring Boot 应用程序无法连接到 mysql
【发布时间】:2017-05-29 15:47:21
【问题描述】:

我的 Spring Boot 应用程序在 localhost 上运行良好,并且已经运行了几个月的第一个版本运行良好,但是现在当我尝试上传新版本的应用程序或任何其他 Spring Boot 应用程序时我收到以下错误:

not eligible for auto-proxying)
2017-05-29 17:20:48.565 ERROR 618 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46) ~[mysql-connector-java-5.1.6.jar:na]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) ~[mysql-connector-java-5.1.6.jar:na]
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) ~[mysql-connector-java-5.1.6.jar:na]
	at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) ~[tomcat-jdbc-8.5.11.jar:na]
	at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.11.jar:na]
	at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:732) [tomcat-jdbc-8.5.11.jar:na]

下面是我的应用程序属性文件:

spring.jpa.hibernate.ddl-auto=update

# Replace with your connection string
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/appName
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=root


# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

spring.datasource.test-on-borrow=true
spring.datasource.connection-test-query=SELECT 1
spring.datasource.tomcat.validation-interval=0
# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000

# Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true


spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
#server.port = 8081

所以,已经检查了 mysql 是否正在运行,并且我可以使用工作台连接到它,并且如前所述连接到 1 个实时应用程序,我没有输入错误的用户名/密码,或对 application.properties 文件进行任何更改导致问题,问题仅在于 Spring Boot 应用程序,而 Spring 应用程序运行良好。 我正在使用Jenkins在Tomcat上部署应用程序,上面发布的错误输出来自jenkins。

【问题讨论】:

    标签: java mysql spring tomcat jenkins


    【解决方案1】:

    我通过以下方式修复它:编辑位于 /etc/mysql/mysql.conf.d/ 目录的 mysqlId.cnf 文件中的绑定地址,如下所示:
    绑定地址= 0.0.0.0

    然后重新加载mysql服务。

    然后我创建了一个新用户,授权如下:

    创建用户 'myuser'@'localhost' 由 'mypass' 识别; CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

    全部授予 TO 'myuser'@'localhost'; GRANT ALL ON . TO 'myuser'@'%';

    和刷新的权限:

    刷新特权;

    致谢@apesa you can find more detailed answer here

    【讨论】:

      【解决方案2】:

      java.sql.SQLException: 用户 'root'@'localhost' 的访问被拒绝 (使用密码:YES)

      这是一个权限问题。您必须拥有GRANT 权限才能使用给定的用户名和密码从该客户端连接到该主机。我不建议授予任何应用程序对数据库的 root 访问权限。为您的应用程序创建特定数据库的应用程序凭据。

      你把这弄得太复杂了。 Spring、Jenkins、Tomcat 等都不是您的问题。编写一个简单的 main 方法来建立一个 JDBC 连接,如下所示:

      package database.util;
      
      import org.mariadb.jdbc.MySQLDataSource;
      
      import javax.sql.DataSource;
      import java.sql.Connection;
      import java.sql.DatabaseMetaData;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      /**
       * Database utilities
       * Created by Michael
       * Creation date 5/3/2016.
       * @link https://stackoverflow.com/questions/36999860/mysql-driver-problems/37000276#comment61553720_37000276
       */
      public class DatabaseUtils {
      
          public static final String DEFAULT_DRIVER = "org.mariadb.jdbc.Driver";
          public static final String DEFAULT_URL = "jdbc:mariadb://localhost:3306/contact";
          public static final String DEFAULT_USERNAME = "contact";
          public static final String DEFAULT_PASSWORD = "contact";
          public static final String DEFAULT_HOST = "localhost";
          public static final int DEFAULT_PORT = 3306;
          public static final String DEFAULT_DATABASE = "contact";
      
          public static void main(String[] args) {
              Connection connection = null;
              try {
                  connection = createConnection(DEFAULT_DRIVER, DEFAULT_URL, DEFAULT_USERNAME, DEFAULT_PASSWORD);
                  DatabaseMetaData meta = connection.getMetaData();
                  System.out.println(String.format("Connected to %s version %s", meta.getDatabaseProductName(), meta.getDatabaseProductVersion()));
              } catch (ClassNotFoundException | SQLException e) {
                  e.printStackTrace();
              } finally {
                  close(connection);
              }
          }
      
          public static DataSource createDataSource(String host, int port, String database) throws ClassNotFoundException, SQLException {
              return new MySQLDataSource(host, port, database);
          }
      
          public static Connection createConnection(String driverClass, String url, String username, String password) throws ClassNotFoundException, SQLException {
              Class.forName(driverClass);
              return DriverManager.getConnection(url, username, password);
          }
      
          public static void close(Connection connection) {
              try {
                  if (connection != null) {
                      connection.close();
                  }
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      
          public static void close(Statement st) {
              try {
                  if (st != null) {
                      st.close();
                  }
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      
          public static void close(ResultSet rs) {
              try {
                  if (rs != null) {
                      rs.close();
                  }
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      }
      

      【讨论】:

      • 不是权限问题,ROOT有*授予..尝试创建并授予新用户,仍然没有用。尝试使用 main 方法,我再次收到错误消息。也许我应该提到我正在将应用程序从一台服务器部署到另一台服务器。我解决了这个问题,如果其他人将来需要它,我会在下面发布它为我做了什么。感谢您的回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2021-04-22
      • 2020-06-27
      • 2020-07-12
      • 2021-07-20
      相关资源
      最近更新 更多