使用的版本:
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界面显示:
这里不清楚的是好像连接数够用,可为什么会变成0?明明是8-1。
原提问者GitHub用户rplees
在代码1中,我们使用了一个参数占位符来表示ids参数,然后将具体的参数值作为一个字符串传递给了JdbcUtils.executeQuery()方法。由于参数占位符只能用于表示单个参数,因此在执行SQL语句时,ids参数将不会被正确地解析为多个参数值,而是作为一个整体字符串被传递给了SQL语句,从而导致查询失败。
相比之下,代码2使用字符串拼接来构建SQL语句,将ids参数直接拼接到SQL语句中。在这种情况下,ids参数被正确地解析为多个参数值,并正确地传递给了SQL语句,从而可以正确执行查询。
找到原因了, 不能这样设置 newDataSource.setValidConnectionChecker(new MySqlValidConnectionChecker()), 会导致打开的连接次数与关闭不匹配,导致有些连接一直打开占有,当初写这个 newDataSource.setValidConnectionChecker(new MySqlValidConnectionChecker());
原回答者GitHub用户rplees
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。