当前位置: 首页 > news >正文

Druid GetConnectionTimeoutException解决方案之一

> Druid版本:v1.2.18

最近项目中经常出现:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 120000, active 0, maxActive 128, creating 0, createErrorCount 2,但是其他平台连接这个数据源正常的
于是做了一个实验复现了这个问题:
1. 先搞一个案例一直拿连接执行
2. 中途关闭数据库模拟网络问题或者数据库服务繁忙的情况 net stop mysql
3. 然后复现了GetConnectionTimeoutException的情况
4. 再开启数据库发现数据库连接没有恢复 net start mysql

解决办法:
 //开启这两个配置就能实现断开重连了,如果没生效尝试升级一下版本1.2.16+
  druidDataSource.setBreakAfterAcquireFailure(false);
  druidDataSource.setKeepAlive(true);

public static void main(String[] args) throws Exception {
        Properties pro = new Properties();
        pro.setProperty(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, "com.mysql.cj.jdbc.Driver");
        pro.setProperty(DruidDataSourceFactory.PROP_URL, "jdbc:mysql://localhost:3306/xxx?useCursorFetch=true");
        pro.setProperty(DruidDataSourceFactory.PROP_USERNAME, "root");
        pro.setProperty(DruidDataSourceFactory.PROP_PASSWORD, "123456");
        pro.setProperty(DruidDataSourceFactory.PROP_MAXWAIT, "120000");
        pro.setProperty(DruidDataSourceFactory.PROP_MAXACTIVE, "16");
        pro.setProperty(DruidDataSourceFactory.PROP_VALIDATIONQUERY, "select 1");
        DruidDataSource druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro);
        druidDataSource.setConnectionErrorRetryAttempts(0);
        druidDataSource.setConnectTimeout(10*1000);
        druidDataSource.setSocketTimeout(90*1000);
        druidDataSource.setRemoveAbandoned(true);

        //开启这两个配置就能实现断开重连了,如果没生效尝试升级一下版本1.2.16+
        druidDataSource.setBreakAfterAcquireFailure(false);
        druidDataSource.setKeepAlive(true);
        druidDataSource.init();

        new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                try {
                    DruidPooledConnection connection = druidDataSource.getConnection();
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = statement.executeQuery("select * from xxx");
                    while (resultSet.next()) {
                        System.out.println(resultSet.getString("id"));
                    }
                    resultSet.close();
                    statement.close();
                    connection.close();
                    Thread.sleep(1000);
                }catch (Exception e){
                    log.error("error", e);
                }

            }
        }).start();
        Thread.sleep(30000000);
    }

相关文章:

  • 数据结构-栈和队列的应用
  • sql注入之盲注(bool盲注,时间盲注)
  • list_for_each_entry_safe 简介
  • AUTOGPT:基于GPT模型开发的实验性开源应用程序; 目标设定与分解 ;;自主思考与决策 ;;信息交互与执行
  • Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
  • 云计算实训室解决方案(2025年最新版)
  • C++ 设计模式-建造者模式
  • 深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
  • MySQL调用存储过程和存储函数
  • win10中mstsc远程Centos-Stream 9图形化界面
  • 简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
  • 朝天椒USB服务器:解决加密狗远程连接
  • 软件工程-软件设计
  • Docker 部署 MySQL-5.7 单机版
  • 浏览器网络请求全流程深度解析
  • 网络协议/MQTT Paho.MQTT客户端库接口基础知识
  • 伺服报警的含义
  • win11 终端乱码导致IDE 各种输出也乱码
  • 《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API在化工行业的双向对接方案
  • 腾讯云服务器中Ubuntu18.04搭建python3.7.0与TensorFlow1.15.0与R-4.0.3环境
  • 动态网站开发工程师证/今天热点新闻事件
  • 光谷做网站推广/百度搜索链接入口
  • iis网站属性里/google下载手机版
  • 上海网站建设公司电/网站推广与优化平台
  • 网站开发步骤规划/百度快照如何优化
  • 专门做布料的网站/郑州seo外包公司哪家好