alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.76k stars 8.55k forks source link

[BUG] 动态创建多数据源,切换时出现死锁程序假死问题 #6011

Open sf386255178 opened 4 days ago

sf386255178 commented 4 days ago

Database Type

Oracle

Database Version

11

Druid Version

1.2.23

JDK Version

OpenJDK 8

Error SQL

select 1 from dual

Testcase Code

//存放连接 private static Map<String, DataSource> dataSourceMap = new ConcurrentHashMap<>(5); //构建配置 private static void buildDatasourceProperties(DruidDataSource dataSource,String url) { dataSource.setInitialSize(10); dataSource.setMaxActive(100); dataSource.setMinIdle(10); dataSource.setMaxWait(100); if (url.contains("oracle")){ dataSource.setPoolPreparedStatements(true); dataSource.setMaxOpenPreparedStatements(20); } dataSource.setMaxPoolPreparedStatementPerConnectionSize(100); dataSource.setTestOnBorrow(false); dataSource.setTestOnReturn(true); dataSource.setTestWhileIdle(true); dataSource.setKeepAlive(true); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setMinEvictableIdleTimeMillis(300000); dataSource.setRemoveAbandoned(false); dataSource.setRemoveAbandonedTimeout(1800); dataSource.setQueryTimeout(60 5); dataSource.setTransactionQueryTimeout(60 20); try { dataSource.setFilters("mergeStat,slf4j"); } catch (SQLException e) { logger.error("【dataSource】异常信息为:{}", ExceptionUtil.getErrorInfoFromException(e)); } }

//构建连接dao public static DataSource put(DatasourceDTO dsConfig) { if (!dataSourceMap.containsKey(dsConfig.getDsName())) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setName(dsConfig.getDsName()); dataSource.setUrl(dsConfig.getUrl()); dataSource.setUsername(dsConfig.getUsername());//用户名 dataSource.setPassword(dsConfig.getPassword());//密码 dataSource.setDriverClassName(dsConfig.getDriverClassName()); //检查的语句 dataSource.setValidationQuery(dsConfig.getTestSql()); buildDatasourceProperties(dataSource,dsConfig.getUrl()); dataSourceMap.put(dsConfig.getDsName(), dataSource); return dataSource; } logger.warn("----------------------------------数据源:{}已存在", dsConfig.getDsName()); return dataSourceMap.get(dsConfig.getDsName()); }

Stacktrace Info

1719828742686

Error Info

我在springboot程序中配置了多个数据源(mysql,oracle),配置均按照官方配置处理,mysql的连接都正常,当我尝试调用接口时切换不同的oracleDao查询表数据时,出现接口超时问题(eg:使用oracle1查询有返回 ,此时再使用oracle2查询接口超时,程序会假死),程序无报错信息,通过jstack查看,发现druid出现死锁问题,仅在使用不同的oracle连接时出现。

sf386255178 commented 4 days ago

尝试过升级到目前最新版本1.2.23仍未解决