首页 > 解决方案 > java.sql.SQLNonTransientConnectionException:无法创建到数据库服务器的连接。尝试重新连接 3 次。放弃

问题描述

它是一个 Web 应用程序,但它不起作用,所以我编写了一个主要方法来查看问题出在哪里。

驱动程序位于 Java Build Path -> Libraries -> Classpath 和 Libraries -> Web App Libraries(在项目资源管理器中)和 WEB-INF ->lib

jar 是 mysql-connector-java-8.0.12。

我已经尝试将其添加到我的连接字符串中:

"useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"

但它没有奏效。

以下代码出现错误

    public synchronized static void aggiungiCliente() throws SQLException 
{
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    String insertSQL = "insert into utente values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";

    try {
        connection = ConnectionPool.getConnection();
        preparedStatement = connection.prepareStatement(insertSQL);
        preparedStatement.setString(1, "aa");  
        preparedStatement.setString(2,"aa");
        preparedStatement.setString(3, "aa"); 
        preparedStatement.setString(4, "aa"); 
        preparedStatement.setString(5,"aa"); 
        preparedStatement.setString(6, "aa");
        preparedStatement.setInt(7, 12);
        preparedStatement.setString(8,"aa"); 
        preparedStatement.setString(9, "aa"); 
        preparedStatement.setString(10,"aa");
        preparedStatement.setInt(11, 12); 
        preparedStatement.setInt(12, 12);
        preparedStatement.setDate(13, java.sql.Date.valueOf(java.time.LocalDate.now())); 
        preparedStatement.setString(14,"aa"); 
        preparedStatement.setString(15,"aa"); 
        preparedStatement.executeUpdate();
        connection.commit();
    } finally {
        try {
            if (preparedStatement != null)
                preparedStatement.close();
        } finally {
            ConnectionPool.releaseConnection(connection);
        }
    }
}


public static void main(String[] args) {

    try {
        aggiungiCliente();
    }
    catch(SQLException e) {
        System.out.println(e);
    }

}

那是连接池应用程序

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList; 
import java.util.List;

public class ConnectionPool {

static {
    freeDbConnections = new LinkedList<Connection>();
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        System.out.println("DB driver not found:"+ e.getMessage());
    } 
}

private static synchronized Connection createDBConnection() throws SQLException {

    Connection newConnection = null;

    String ip = "localhost";
    String port = "3306";
    String db = "code_omnia?autoReconnect=true&useSSL=false";
    String username = "root";
    String password = "Bonucci97";


    newConnection = DriverManager.getConnection("jdbc:mysql://"+ ip+":"+ port+"/"+db, username, password);
    newConnection.setAutoCommit(false);
    return newConnection;
}

public static synchronized Connection getConnection() throws SQLException {
    Connection connection;

    if (!freeDbConnections.isEmpty()) {
        connection = (Connection) freeDbConnections.get(0);
        freeDbConnections.remove(0);

        try {
            if (connection.isClosed())
                connection = getConnection();
        } catch (SQLException e) {
            connection.close();
            connection = getConnection();
        }
    } else {
        connection = createDBConnection();
    }

    return connection;
}

public static synchronized void releaseConnection(Connection connection) throws SQLException {
    if (connection != null)
        freeDbConnections.add(connection);
}





private static List<Connection> freeDbConnections;
}

和堆栈跟踪

java.sql.SQLNonTransientConnectionException:无法创建到数据库服务器的连接。尝试重新连接 3 次。放弃。
在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
在 com.mysql.cj.jdbc .exceptions.SQLError.createSQLException(SQLError.java:89)
在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
在 com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError .java:73)
在 com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:902)
在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:827)
在 com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456)
在 com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
在 com.mysql.cj.jdbc.NonRegisteringDriver.connect( NonRegisteringDriver.java:207)
at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
at model.ConnectionPool.createDBConnection(ConnectionPool.java:28 )
在 model.ConnectionPool.getConnection(ConnectionPool.java:49)
在 model.Query.aggiungiCliente(Query.java:38)
在 model.Query.main(Query.java:20)
原因:com.mysql.cj.exceptions.InvalidConnectionAttributeException:服务器时区值“ora legale Europa occidentale”无法识别或代表多个时区。如果要使用时区支持,则必须配置服务器或 JDBC 驱动程序(通过 serverTimezone 配置属性)以使用更具体的时区值。
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (未知来源)
在 java.base/java.lang.reflect.Constructor.newInstance(未知来源)
在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
在 com.mysql.cj.util.TimeUtil.getCanonicalTimezone (TimeUtil.java:128)
在 com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2236)
在 com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2260)
在com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1314)
在 com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:865)
... 10 更多

标签: javamysqleclipseexception

解决方案


推荐阅读