MySQL或mybatis连接异常:No operations allowed after connection closed & Communications link failure

使用javaSE连接mysql,无论是直接使用jdbc连接还是使用mybatis,运行一段时间后,都有如下两个异常:

No operations allowed after connection closed
或

CommunicationsException: Communications link failure The last packet successfully received from the server was 53,159 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.

无论是修改连接后的参数例如增加autoReconnect=true或者useSLL=false都无效,直接修改mysql的基本配置比如连接的超时时间也是不可取的,因为如果使用的是客户的mysql,自己使用方式不恰当还要给人家硬改配置也只是以开发者思维去做项目而不是客户角度。

解决办法就是使用阿里的druid数据库连接池,让连接池自己去维护连接,包括重连机制,druid都会自己根据配置去做维护。

上代码:

第一步:获取druid数据源

    /**
     * 获取druid数据源
     *
     * @return
     * @throws SQLException
     */
    public static DruidDataSource getDefaultMysqlDataSource() throws SQLException {
        String mysqlUrl = "";
        String username = "";
        String password = "";
        String driverClass = "";


        //jdbc配置
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(mysqlUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);

        //连接池配置
        dataSource.setMaxActive(20);
        dataSource.setMinIdle(1);
        dataSource.setInitialSize(1);
        dataSource.setMaxWait(60000);
        dataSource.setKeepAlive(true);
        dataSource.setTimeBetweenEvictionRunsMillis(10000);
        dataSource.setMinEvictableIdleTimeMillis(300000);
        dataSource.setMaxEvictableIdleTimeMillis(600000);
        dataSource.setTestWhileIdle(true);
        dataSource.setTestOnBorrow(false);
        dataSource.setTestOnReturn(false);
        dataSource.setValidationQuery("SELECT 'x'");
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        dataSource.setFilters("stat");

        return dataSource;
    }

第二步:直接使用数据源获取连接并操作数据库

/**
* 非常重要的提示:
* 注意:连接每次使用完请关闭,否则会导致连接一直存在并被占用,新的请求到来,会创建新的连接,
* 等连接达到数据库连接的最大值,新请求就无法被处理。这里把连接关闭后,连接会还给druid连接池,
* 新的请求到来,会复用这个连接。
*/
try (DruidPooledConnection connection = defaultMysqlDataSource.getConnection()){

    String sql = "insert into sub1 (id, message, status, result, exectime) " +
            "        values(?, ?, ?, ?, NOW())";

    PreparedStatement ps = connection.prepareStatement(sql);
    ps.setString(1, log.getSubUri());
    ps.setString(2, log.getMessage());
    ps.setString(3, log.getStatus());
    ps.setString(4, log.getResult());

    ps.executeUpdate();

} catch (SQLException e) {
    logger.error("插入日志失败", e);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值