`
m635674608
  • 浏览: 5028608 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Druid连接池 一个设置 removeAbandonedTimeout

 
阅读更多
<!-- 超过时间限制是否回收 -->  
<property name="removeAbandoned" value="true" />  
<!-- 超时时间;单位为秒。180秒=3分钟 -->  
<property name="removeAbandonedTimeout" value="180" />  
<!-- 关闭abanded连接时输出错误日志 -->  
<property name="logAbandoned" value="true" />  

 使用druid连接池的超时回收机制排查连接泄露问题

1
2
3
4
5
6
7
8
9
10
11
12
13
DEBUG: (BaseJdbcLogger.java:132)    ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@4d4e22e1]
[2014-07-17 15:19:35]5363945354 [Druid-ConnectionPool-Destory-1422598563] com.alibaba.druid.pool.DruidDataSource:1132 
WARN : (DruidDataSource.java:1132)   get/close not same thread
 
ERROR: (DruidDataSource.java:1815)   abandon connection, open stackTrace
        at java.lang.Thread.getStackTrace(Thread.java:1588)
    at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4534)
    at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4530)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:880)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:872)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:97)

 

    这个是最初的异常, 后面还有一大批异常,

1
2
3
4
5
Caused by: java.sql.SQLException: connection holder is null
    at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1085)
    at com.alibaba.druid.pool.DruidPooledConnection.getMetaData(DruidPooledConnection.java:825)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:285)
    ... 70 more

 

    说什么holder为空

    第一眼看到holder就像到Spring的源码, 里面到处是holder(笑)

    但是这里的holder不是Spirng里面的,是Druid的

    这个holder大概是用来hou住连接池里面的连接的.

    然后为什么为空了呢? 目测是哪个链接坏了, 或者被意外的关闭了...

    根据异常调源码  at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)

1
2
3
4
5
6
7
8
9
10
941         if (isRemoveAbandoned()) {
942                StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
943                poolalbeConnection.setConnectStackTrace(stackTrace);
                poolalbeConnection.setConnectedTimeNano();
                poolalbeConnection.setTraceEnable(true);
 
                synchronized (activeConnections) {
                    activeConnections.put(poolalbeConnection, PRESENT);
                }
            }

 

    看不出啥来. 只能将日志继续看看, 还是看不出啥来

    然后看了上面代码几遍后, 老觉得 isRemoveAbandoned() 这个方法有鬼.

    查看调用处,:

    恩, 这个DestroyConnectionThread非常可疑, 跳

1
2
3
                    if (isRemoveAbandoned()) {
                        removeAbandoned();
                    }

 

    继续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public int removeAbandoned() {
        int removeCount = 0;
 
        long currrentNanos = System.nanoTime();
 
        List<DruidPooledConnection> abandonedList = new ArrayList<DruidPooledConnection>();
 
        synchronized (activeConnections) {
            Iterator<DruidPooledConnection> iter = activeConnections.keySet().iterator();
 
            for (; iter.hasNext();) {
                DruidPooledConnection pooledConnection = iter.next();
 
                if (pooledConnection.isRunning()) {
                    continue;
                }
 
                long timeMillis = (currrentNanos - pooledConnection.getConnectedTimeNano()) / (1000 1000);
 
                if (timeMillis >= removeAbandonedTimeoutMillis) {
                    iter.remove();
                    pooledConnection.setTraceEnable(false);
                    abandonedList.add(pooledConnection);
                }
            }
        } ....略
    }

 

    擦, 这里不对头,   timeMillis >= removeAbandonedTimeoutMillis  timeMillis 这个是getConnection()被调用时的时间

    意思就是一个连接被get后, 超过了 removeAbandonedTimeoutMillis这么久我就弄死你.

    然后继续找removeAbandonedTimeoutMillis 这玩意在哪里设置的   ,最后发现是在

 

<property name="removeAbandoned" value="true" />

<property name="removeAbandonedTimeout" value="1800" />

    初始化配置的这里设置的,  这两个参数的大概意思就是, 

    通过datasource.getConnontion() 取得的连接必须在removeAbandonedTimeout这么多秒内调用close(),要不我就弄死你.(就是conn不能超过指定的租期)

    然后调成2个小时~~~

    然后程序成功跑完~~~华丽丽的等了50分钟

    总结:

    连接池为了防止程序从池里取得连接后忘记归还的情况, 而提供了一些参数来设置一个租期, 使用这个可以在一定程度上防止连接泄漏

    但是如果你的业务真要跑这么久~~~~那还是注意下这个设置.

 

 

http://my.oschina.net/haogrgr/blog/224010

 

分享到:
评论

相关推荐

    普元平台使用阿里druid数据库连接池的配置说明20171010.docx

    阿里Druid数据库连接池在普元平台中的配置说明 普元EOS开发平台默认数据源支持jndi、c3p0,但其性能较差,改用阿里巴巴Druid数据库连接池可以提高性能。下面是配置阿里Druid数据库连接池的步骤和说明: 1. 通过 ...

    数据库连接池druid-1.1.21.jar 和 配置文件druid.properties

    Druid是一个流行的Java数据库连接池实现,由阿里巴巴开发并开源。它不仅提供了数据库连接池的功能,还包含了监控、SQL解析、日志等附加特性。Druid 1.1.21是这个库的一个稳定版本,包含了一些性能优化和bug修复。 1...

    java druid

    Java Druid 是一个强大的数据库连接池组件,由阿里巴巴开发并开源,它在性能、监控和扩展性方面表现出色。Druid 提供了丰富的监控统计功能,同时支持 SQL 解析和 SQL 防火墙,旨在提高数据库连接管理和使用的效率与...

    druid-1.0.9(含配置文件).zip

    Druid的核心设计理念是监控和诊断,它不仅提供了一个优秀的数据库连接管理功能,还具备丰富的监控统计功能,为系统性能优化提供了强有力的支持。 1. **Druid的基本功能**: - 连接池管理:Druid能够有效地管理和...

    德鲁伊连接池操作文档

    配置德鲁伊连接池的核心在于定义一个数据源(`DataSource`)。下面是一个典型的德鲁伊数据源配置示例,使用了Spring框架的XML配置方式: 1. **基础配置**: - `url`: 数据库URL。 - `username`: 数据库用户名。 ...

    SpringBoot整合JDBC&Druid;数据源示例

    在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...

    Mybatis如何配置连接池

    这样,MyBatis就能利用Druid连接池进行高效的数据库操作。配置合理的连接池参数可以显著提升应用性能,减少数据库系统的压力。同时,Druid还提供了丰富的监控统计功能,便于开发者分析和优化数据库连接使用情况。在...

    Tomcatc3p0配置jnid数据源2种实现方法解析

    Druid是阿里巴巴开源的一个高性能、全面的数据库连接池,它不仅提供了监控、日志等功能,还具有优秀的性能。同样,你需要先在项目的`pom.xml`文件中引入Druid依赖: ```xml &lt;groupId&gt;com.alibaba&lt;/groupId&gt; ...

Global site tag (gtag.js) - Google Analytics