APM监控显示有大量的Druid-ConnectionPool-Create和Druid-ConnectionPool-Destroy线程

flseospp  于 2023-02-04  发布在  Druid
关注(0)|答案(6)|浏览(349)

DruidDataSource配置如下

DruidDataSource dataSource = new DruidDataSource();
dataSource.setName("SqlServer");
dataSource.setDriverClassName(SqlUtil.getDriverClass(“${datasourcename}”));
dataSource.setMaxActive(200);
dataSource.setPoolPreparedStatements(false);
dataSource.setUrl("${url}");
dataSource.setUsername("${userName}");
dataSource.setPassword("${pwd}");
dataSource.setMaxWait(6000);
dataSource.setQueryTimeout(600);
dataSource.setMinIdle(20);
dataSource.setInitialSize(1);
dataSource.setTimeBetweenEvictionRunsMillis(60000);
dataSource.setMinEvictableIdleTimeMillis(300000);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestWhileIdle(false);
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
dataSource.setDefaultReadOnly(true);
dataSource.setBreakAfterAcquireFailure(true);
return dataSource;

线上运行环境:
Server version: Apache Tomcat/8.0.30 OS Name: Linux JVM Version: 1.8.0_65-b17
JVM配置:
JAVA_OPTS=-Ddruid.registerToSysProperty=true -Duser.timezone=GMT+08 -server -Xms5g -Xmx5g -XX:MaxNewSize=1536m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-UseGCOverheadLimit -XX:+UseConcMarkSweepGC -XX:+PrintGCDateStamps -javaagent:/data/jvmMonitorAgent/jvmMonitorAgent-1.0.4-jdk7.jar="enable:true;config:/data/jvmMonitorAgent/jvmMonitorAgent.properties" -javaagent:/usr/local/apm_agent/apm.agent.bootstrap.jar -Dapm.applicationName=${DAOKEAPPUK} -Dapm.agentId=${DAOKEIP}-${DAOKEID} -Dapm.env=${DAOKEENVTYPE}
线上运行一段时间后会有大量的Druid-ConnectionPool-Create和Druid-ConnectionPool-Destroy线程,占比1:1,约共有9k个线程,大量的线程导致GC比较频繁最终运行的时间长会导致tomcat不响应。不知道是不是dataSource配置的姿势不对,系统会有几十个不同的数据库连接来满足不同人的需求。

iqjalb3h

iqjalb3h1#

每次都new DruidDataSource了么?

v2g6jxz6

v2g6jxz62#

没有new,放在guava cache里面了,cache里面大概保持在size=40+,然后DataSource打印的数据如下:>>>dataSource getActiveCount:1,getDestroyCount:0,getPoolingCount:1,getPoolingCount:0

omjgkv6w

omjgkv6w3#

如果有多个DruidDataSource,可以考虑使用DruidDataSource#setCreateScheduler和DruidDataSource#setDestroyScheduler,配置公用创建和销毁检测线程。

wdebmtf2

wdebmtf24#

好的,我试一试。

izkcnapc

izkcnapc5#

@wenshao 对于多个数据源DruidDataSource创建共用的创建和销毁检测线程池,那个线程池的中线程的数量该如何定呢?
如果创建线程池的线程过少数据源又比较多是不是又会导致用户线程拿不到连接呢?比较疑惑

scyqe7ek

scyqe7ek6#

@
好的,我试一试。

你好,这个问题还有印象么,是什么问题造成的,解决了么

相关问题