开发者社区> 问答> 正文

DruidDataSource.takeLast方法一直卡住,导致无法获取连接

使用的版本:

com.alibaba druid-spring-boot-starter 1.1.6

问题描述: 同一个接口连续刷新8+次以上就会出现接口访问不到,调试时发现DruidDataSource.takeLast方法的poolingCount==0,notEmpty.await() 一直在这不动了,我引用DruidDataSource的代码

DruidDataSource newDataSource = DruidDataSourceBuilder.create().build(); newDataSource.setDriverClassName(driverClassName); newDataSource.setUrl(placeDatasource.getUrl()); newDataSource.setUsername(placeDatasource.getUsername()); newDataSource.setPassword(placeDatasource.getPassword()); try { newDataSource.addFilters("stat"); } catch (SQLException e) { e.printStackTrace(); } // FIX BUG https://github.com/alibaba/druid/issues/2265 newDataSource.setValidConnectionChecker(new MySqlValidConnectionChecker());

不知道是我是代码创建DruidDataSource有什么值. ps: 当不设置最大连接数的时候默认为DEFAULT_MAX_ACTIVE_SIZE=8,当拿不到连接的时候druid界面显示:

T50.png

这里不清楚的是好像连接数够用,可为什么会变成0?明明是8-1。

原提问者GitHub用户rplees

展开
收起
山海行 2023-07-05 20:04:12 600 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在代码1中,我们使用了一个参数占位符来表示ids参数,然后将具体的参数值作为一个字符串传递给了JdbcUtils.executeQuery()方法。由于参数占位符只能用于表示单个参数,因此在执行SQL语句时,ids参数将不会被正确地解析为多个参数值,而是作为一个整体字符串被传递给了SQL语句,从而导致查询失败。

    相比之下,代码2使用字符串拼接来构建SQL语句,将ids参数直接拼接到SQL语句中。在这种情况下,ids参数被正确地解析为多个参数值,并正确地传递给了SQL语句,从而可以正确执行查询。

    2023-07-30 14:35:09
    赞同 展开评论 打赏
  • 找到原因了, 不能这样设置 newDataSource.setValidConnectionChecker(new MySqlValidConnectionChecker()), 会导致打开的连接次数与关闭不匹配,导致有些连接一直打开占有,当初写这个 newDataSource.setValidConnectionChecker(new MySqlValidConnectionChecker());

    原回答者GitHub用户rplees

    2023-07-06 11:18:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载