com.mysql.cj.jdbc.exceptions.CommunicationsExcep

我有一个不使用连接池的 Spring Boot 应用程序,我们不想在每个请求时都打开一个 DB 连接


因此,这是我们在一个名为的类中所拥有的,该类MySQLService具有带有 DB 查询的方法:


    @Autowired

    @Qualifier("mysqlDB")

    private Connection connection;

这个connection对象总是在所有带有查询的方法中使用。


在 MySQLConnection 类中,


 @Bean(name = "mysqlDB")

    public Connection getConnection() {

        Connection connection = null;

        try {

            Class.forName(mysqlDriver);

            LOGGER.debug("get mysql connection...");

            connection = DriverManager

                    .getConnection(jdbcUrl,

                            user, password);

        } catch (Exception exception) {

            LOGGER.error("ERROR :: {}", exception);

                        }    

        return connection;

    }

}

所以,我们从来没有真正关闭连接,它是由 spring 上下文管理的,但由于我们没有使用 JDBCTemplates,它不会被关闭。我们已经autoreconnect设置为true连接字符串。


一两天后,我们得到了异常:


com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 61,183,452 milliseconds ago.

我知道这是因为 SQL Server 设置了连接生命周期,所以它使连接过期,但是有什么方法可以在不使用连接池的情况下处理这个问题


慕尼黑5688855
浏览 182回答 1
1回答

慕哥9229398

每 6 小时左右安排一次对 MySQL 服务器的 ping,执行以下查询select 1 from dual:为此,您需要启用调度:@Configuration@EnableSchedulingpublic class SpringConfig {    //...}然后:@Scheduled(cron = "0 */6 * * *")public void schedulePingMySQL() {   // execute `select 1 from dual`}无论如何,推荐使用连接池。这种情况下的代码可能如下所示: @Autowiredprivate DataSource dataSource;public void save (Dto dto) {    Connection con = dataSource.getConnection();    // finally, close the connection}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java