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配置的姿势不对,系统会有几十个不同的数据库连接来满足不同人的需求。
6条答案
按热度按时间iqjalb3h1#
每次都new DruidDataSource了么?
v2g6jxz62#
没有new,放在guava cache里面了,cache里面大概保持在size=40+,然后DataSource打印的数据如下:>>>dataSource getActiveCount:1,getDestroyCount:0,getPoolingCount:1,getPoolingCount:0
omjgkv6w3#
如果有多个DruidDataSource,可以考虑使用DruidDataSource#setCreateScheduler和DruidDataSource#setDestroyScheduler,配置公用创建和销毁检测线程。
wdebmtf24#
好的,我试一试。
izkcnapc5#
@wenshao 对于多个数据源DruidDataSource创建共用的创建和销毁检测线程池,那个线程池的中线程的数量该如何定呢?
如果创建线程池的线程过少数据源又比较多是不是又会导致用户线程拿不到连接呢?比较疑惑
scyqe7ek6#
@
好的,我试一试。
你好,这个问题还有印象么,是什么问题造成的,解决了么