Open sf386255178 opened 4 days ago
Oracle
11
1.2.23
OpenJDK 8
select 1 from dual
//存放连接 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()); }
我在springboot程序中配置了多个数据源(mysql,oracle),配置均按照官方配置处理,mysql的连接都正常,当我尝试调用接口时切换不同的oracleDao查询表数据时,出现接口超时问题(eg:使用oracle1查询有返回 ,此时再使用oracle2查询接口超时,程序会假死),程序无报错信息,通过jstack查看,发现druid出现死锁问题,仅在使用不同的oracle连接时出现。
尝试过升级到目前最新版本1.2.23仍未解决
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
Error Info
我在springboot程序中配置了多个数据源(mysql,oracle),配置均按照官方配置处理,mysql的连接都正常,当我尝试调用接口时切换不同的oracleDao查询表数据时,出现接口超时问题(eg:使用oracle1查询有返回 ,此时再使用oracle2查询接口超时,程序会假死),程序无报错信息,通过jstack查看,发现druid出现死锁问题,仅在使用不同的oracle连接时出现。