数据库连接池的配置问题-空闲线程的监控和回收. druid 1.8的一个bug
来源:互联网 发布:沙滩泳衣 知乎 编辑:程序博客网 时间:2024/05/20 21:19
* jdbc pool : lhttp://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html (TheJDBC Connection Poolorg.apache.tomcat.jdbc.pool is a replacement or an alternative to theApache Commons DBCP connection pool. )
* druid的中文配置说明 (配置项和dbcp是一致的),不如英文来的明了。” https://github.com/alibaba/druid/wiki/DruidDataSource配置属性列表 “
jdbc连接池连接过多且又空闲不使用就需要进行回收。这个不管是数据库连接池还是java线程池都有一样的诉求。
jdbc连接池不同于线程池的是,连接有可能提前被数据库关闭掉。这个将导致后续的请求使用该连接的时候抛错或者 通过重连导致超时。
故为解决该问题需要配置配置。
<property name="testWhileIdle" value="true" />
<!-- 配置限制超时限制,如果超过此时间进行一次检测,如果连接失效(被服务端关闭),那么就驱逐(evict)该连接,单位是毫秒.c3p0中取名为 idleConnectionTestPeriod. druid有DruidDataSourceC3P0Adapter类适配.
--><property name="timeBetweenEvictionRunsMillis" value="${jdbc.idleConnectionTestPeriod}" /><!-- 配置一个连接在池中最小可驱逐时间超过这个时间,就可驱逐. 单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="${jdbc.maxIdleTime}" />
我们系统中目前设置的是jdbc.maxIdleTime=14400000 ,minIdle=2014400000/3600/1000 = 4小时我们的数据库目前设置为3分钟即断开。故客户端连接池设置时间短一点:2.9分钟,会回收连接直到20.剩下的20个连接即使一直空闲也不回收,符合连接池的意义。但是数据库会把这20个连接关闭。故每次获取连接时会发现连接失效! 依旧无法解决抛错或者超时的问题。怎么办?把 testWhileIld打开后,每次从连接池里获取连接,发现超过了idleConnectionTestPeriod,就会进行检测.if (isTestWhileIdle()) { final long currentTimeMillis = System.currentTimeMillis(); final long lastActiveTimeMillis = poolableConnection.getConnectionHolder().getLastActiveTimeMillis(); final long idleMillis = currentTimeMillis - lastActiveTimeMillis; long timeBetweenEvictionRunsMillis = this.getTimeBetweenEvictionRunsMillis(); if (timeBetweenEvictionRunsMillis <= 0) { timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; } if (idleMillis >= timeBetweenEvictionRunsMillis) { boolean validate = testConnectionInternal(poolableConnection.getConnection()); if (!validate) { if (LOG.isDebugEnabled()) { LOG.debug("skip not validate connection."); } discardConnection(realConnection); continue; } }}只能查看druid的监控,查看峰值活跃数。不停调整值{ "url": "jdbc:mysql://xxxx?characterEncoding=UTF-8", "dbType": "mysql", "name": "DataSource-4129454", "activeCount": 0, "activePeak": 4, "activePeakTime": "2016-02-16 00:00:03", "poolingCount": 5, "poolingPeak": 6, "poolingPeakTime": "2016-02-15 23:59:25", "connectCount": 8788, "closeCount": 8787, "executeCount": 9757, "commitCount": 485, "pstmtCacheHitCount": 9753, "pstmtCacheMissCount": 4, "startTransactionCount": 485, "transactionHistogram": [ 0, 485 ], "connectionHoldTimeHistogram": [ 8274, 513 ], ]}{ "url": "jdbc:mysql://xxx?characterEncoding=UTF-8", "dbType": "mysql", "name": "DataSource-4129454", "activeCount": 0, "activePeak": 4, "activePeakTime": "2016-02-15 22:00:10", "poolingCount": 4, "poolingPeak": 4, "poolingPeakTime": "2016-02-15 21:59:13", "connectCount": 9354, "closeCount": 9354, "executeCount": 9962, "errorCount": 1, "commitCount": 305, "pstmtCacheHitCount": 9956, "pstmtCacheMissCount": 6, "startTransactionCount": 305, "transactionHistogram": [ 0, 305 ], "connectionHoldTimeHistogram": [ 8999, 353, 2 ]}
0 0
- 数据库连接池的配置问题-空闲线程的监控和回收. druid 1.8的一个bug
- Druid数据库连接池及内置监控的配置和使用
- Druid数据库连接池及内置监控的配置和使用
- 使用注解的形式配置druid数据库连接池监控
- 阿里巴巴 Druid 数据库连接池监控界面配置的参数解读
- 数据库连接池Druid的配置,实用
- Druid数据库连接池的使用和详解
- 关于数据库连接池的最大空闲时间的配置
- 程序调试优化二:使用Druid的数据库连接池和SQL监控
- Mysql实现监控数据统计分析:Druid开源分布式系统与阿里巴巴的Druid数据库连接池
- Druid数据库连接池的使用
- 数据库连接池的选择 Druid
- 数据库连接池druid 的使用
- 阿里数据库连接池之Druid 的介绍及配置
- 线程池的配置和监控
- spring-boot 连接池 druid 的配置及监控
- springboot的druid监控
- 如何处理数据库连接空闲太久导致失败的问题
- IntelliJ IDEA 使用心得与常用快捷键
- Android 标签控件 标签选择 tag
- html5伪3d游戏探索
- 任务调度的 Java 实现方法一:Timer、TimerTask、 ScheduledExecutorService
- 安卓UI设计实例教程打包
- 数据库连接池的配置问题-空闲线程的监控和回收. druid 1.8的一个bug
- Linux之切换用户以及查看容量
- Android Wear开发浅析(一)
- 自定义Adapter
- 多选下拉列表
- egret鼠标变小手实现思路
- java 获取本机的公网、外网ip
- java.net.SocketTimeoutException: failed to connect to /10.0..2.2 (port 8080) after 10000ms
- 日期属于一年中的第几周