zoukankan      html  css  js  c++  java
  • Cannot get a connection, pool exhausted解决办法

    http://blog.163.com/it_message/blog/static/8892051200908102032653/

    连接池(Tomcat+oracle),运行一段时间后就会出现 Cannot get a connection, pool exhausted这样的异常。其实这个问题很简单就是数据库connection对象用尽了。

    解决的办法有3个

    1重启服务器

    2在content.xml中,将maxActive设置为零,或者调高它的值

    3在你的程序中正确关闭connections 这里有一点要注意要把关闭的语句写在finally中,如果你写在try{}中出现异常的话是无法正确关闭的。

    要象这样

    } catch (SQLException e) {

    /** Exception handling **/

    } finally {

    try {

    if (stmt != null)

    stmt.close();

    if (dbConnection != null)

    dbConnection.close();

    } catch (SQLException e) {

    /** Exception handling **/

    }

    }

    当然这3个方法里前两个并不能从根本上解决你的问题,所以还是要好好研究你的程序,一定要将用完的connection放回到池中。

    1 问题描述

    Web程序在tomcat刚开始运行时速度很快,但过一段时间后发现速度变得很慢。

    检查日志输出,发现异常如下:

    org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:

    java.util.NoSuchElementException: Timeout waiting for idle object

    同时在SQLServer事件探查器中发现,每执行一次sql语句都要产生Audit login事件,语句执行后产生

    Audit logout事件。说明每一次tomcat都是重新打开新的连接。

    2 问题解决

    tomcat 的数据源定义提供了三个参数:

    a. 如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)

    <parameter>

    <name>removeAbandoned</name>

    <value>true</value>

    </parameter>

    b. 设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。

    <parameter>

    <name>removeAbandonedTimeout</name>

    <value>60</value>

    </parameter>

    c. 输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏

    <parameter>

    <name>logAbandoned</name>

    <value>true</value>

    </parameter>

    ---------------------------------------------------------------------------------------------------------------------------------------

     maxActive、maxIdle 建议设置 maxActive="300" maxIdle="50"

    maxActive 设置在300-1000之间

    maxIdle   设置在 20-100 之间

    还有就是在程序的 finally 里面要关闭 Connection

    例如: DbHelper.closedAll(rs, ps, conn);

    maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连 
    接将被标记为不可用,然后被释放。设为0表示无限制。 
    MaxActive,连接池的最大数据库连接数。设为0表示无限制。 
    maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示 
    无限制。 

  • 相关阅读:
    [redis] redis在线系统热迁移的方案与记录
    [golang] go get无法安装官方软件包
    我有关编程语言的一点理解
    [nginx] nginx源码分析--健康检查模块锁分析
    [nginx] nginx的hash与bucket size分析
    [daily][linux] dmesg格式里的时间为什么不准
    [daily] 查看linux程序或操作的kernel内核调用栈
    [go] 像gdb一样使用dlv debug golang程序
    [tls][https][nginx] https的client session cache与session ticket机制分析
    [性能优化] CPU电源管理pstate cstate
  • 原文地址:https://www.cnblogs.com/lteal/p/5896171.html
Copyright © 2011-2022 走看看