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

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);


```java

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);
    }
```


http://www.kler.cn/a/543234.html

相关文章:

  • git学习【个人记录b站尚硅谷】
  • hot100_23. 合并 K 个升序链表
  • 优化关键词还有哪些软件可用?
  • 没有服务器和显卡电脑如何本地化使用deepseek|如何通过API使用满血版deepseek
  • 从MySQL优化到脑力健康:技术人与效率的双重提升
  • CNN-LSTM卷积神经网络长短期记忆神经网络多变量多步预测,光伏功率预测
  • 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接
  • Cursor无法安装插件解决方法
  • 操作系统|ARM和X86的区别,存储,指令集
  • 在anaconda环境中构建flask项目的exe文件
  • 后端面试题
  • 1.2 快速搭建环境
  • npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported
  • Three.js编辑器百度搜索 Top 1
  • Python解决“数字字符串千分位转化”问题
  • 制造企业智慧物流架构解决方案
  • leetcode_深度搜索和广度搜索 116. 填充每个节点的下一个右侧节点指针
  • C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现
  • 笔试题笔记#3
  • PyTorch Lightning Trainer介绍
  • Spring 核心技术解析【纯干货版】- XII:Spring 数据访问模块 Spring-R2dbc 模块精讲
  • 如何在WinForms应用程序中读取和写入App.config文件
  • 记忆模块概述
  • 用AI做算法题1
  • 深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类
  • 网络工程师 (33)VLAN注册协议——GVRP协议