Java 为什么我的程序中定期出现JDBCMySQL通信链路故障,有哪些原因?

Java 为什么我的程序中定期出现JDBCMySQL通信链路故障,有哪些原因?,java,mysql,jdbc,amazon-ec2,Java,Mysql,Jdbc,Amazon Ec2,我在AmazonEC2服务器上部署了一个MySQL实例,以及一个连接到本地数据库的Java.Jar文件,用于归档从API检索到的元数据。我通过Linux Crontab任务每天自动执行4次Java文件 我的代码一开始总是运行并连接到MySQL,但在执行后大约一分钟,它就会遇到JDBC通信链路故障(不过,发生这种情况的时间范围可能会有所不同)。这是显示给终端的以下错误消息: com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障 从服

我在AmazonEC2服务器上部署了一个MySQL实例,以及一个连接到本地数据库的Java.Jar文件,用于归档从API检索到的元数据。我通过Linux Crontab任务每天自动执行4次Java文件

我的代码一开始总是运行并连接到MySQL,但在执行后大约一分钟,它就会遇到JDBC通信链路故障(不过,发生这种情况的时间范围可能会有所不同)。这是显示给终端的以下错误消息:

com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障

从服务器成功接收的最后一个数据包是4278毫秒前

在显示上述错误消息之前,我的程序似乎已冻结。我的程序冻结是显而易见的,因为它将停止输出:“元数据点已存档”。我有自己的程序输出,每次API中的元数据点都会相应地归档到数据库的表中

为了解决这个问题,我尝试了很多解决方案,但我完全不知道是什么导致了这个问题。我在url字符串中添加了多个参数: jdbc:mysql://localhost/MYDBNAME?serverTimezone=EST5EDT&useSSL=false&autoReconnect=true&maxReconnects=10&failOverReadOnly=false&allowPublicKeyRetrieval=true&useUnicode=true&tcpKeepAlive=true&interactiveClient=true autoReconnect参数有时允许我的程序在通信链路出现故障后重新连接到数据库并重新执行,但有时根本没有帮助

我已经确保我的程序在程序完成之前不会关闭JDBC连接。 我已经确保所有preparedstatements和ResultSet在执行或从中检索值后在finally块中关闭

我已经确保我的程序使用的MySQL连接器java driver.jar的版本与安装的MySQL数据库的版本匹配

我已经尝试增加MySQL的内置超时变量

下面是我用来初始化连接全局变量的方法,该变量由此类中的方法专门用于查询

private void setUpConnectionToDatabase() { 
    try {
        connection = DriverManager.getConnection(
                url, username, password); // connects to server using url, username, password.

    } catch (Exception e) {
        System.out.println(e);
        connection=null;
    }
}
以下是我查询数据库的方法之一,如果您看到任何错误,请告诉我。类中的其他方法基本上遵循相同的格式。请注意,连接变量本身不会在方法中关闭

public Coordinates getCoordsFromArchivedLocationData(String bioLocation) {
    Coordinates coords= new Coordinates();
    double lat=0;
    double longit=0;
    String queryStatement= "SELECT latitude, longitude FROM archived_location_data WHERE LocationName=?;";
    PreparedStatement query=null;
    ResultSet result=null;

    try {
        query = connection.prepareStatement(queryStatement);
        query.setString(1, bioLocation);
        result = query.executeQuery();
        if(result.next()) {
            lat= result.getDouble(1);
            longit= result.getDouble(2);
        }
        coords.setLatitude(lat);
        coords.setLongitude(longit);
    }
    catch(Exception e) {
        System.out.println(e);
        return coords;
    }
    finally {
        try {
            if(query != null) {
            query.close();
            }
            if(result != null) {
            result.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    return coords;


}
“我已确保我的程序在程序完成之前不会关闭JDBC连接。”相反,请尝试使用连接池,从该池获取连接,并在完成一个工作单元后立即关闭它(关闭会将其返回到连接池)。服务器可能会自动终止长时间运行的连接,您可以配置连接池以替换老化的连接。“我已确保我的程序在程序完成之前不会关闭JDBC连接。”相反,请尝试使用连接池,并从该连接池获取连接,并在完成一个工作单元后立即将其关闭(关闭会将其返回到池中)。服务器可能会自动终止长时间运行的连接,您可以配置连接池以替换老化的连接。