• JavaEE连接池泄漏问题检测Oracle数据库


    1、项目环境

    项目是典型的轻量级JavaEE项目,使用SSH框架构建,数据源使用DBCP管理,和Spring进行了整合。

    项目数据库使用Oracle数据库。

    项目DBCP配置内容如下

    ###### DBCP连接池参数配置 ###### ######
    #jdbc连接池初始连接数,设置后更好发挥连接池左右
    jdbc.initialSize=10
    #jdbc最大活动连接数,即连接池上限,要小于数据库连接上限,项目组根据系统最大用户上限数和访问量来调整
    jdbc.maxActive=20
    #jdbc最大空闲连接数 ,建议与初始连接数相同
    jdbc.maxIdle=10
    #jdbc最大等待连接数,必须小于sql或存储过程最长执行时间,-1表示无限制
    jdbc.maxWait=-1
    ###### DBCP连接池高级参数配置 ###### ######
    #是否让连接池自动回收泄露的连接
    jdbc.removeAbandoned=true
    #jdbc连接保持超过2小时(3600秒),并且剩余连接很少时自动回收泄露的连接
    #规则:剩余空闲连接<2,当前活动连接数仅比最大连接上限小3
    jdbc.removeAbandonedTimeout=5
    #数据库连接断开或重启后连接池用该语句测试来恢复连接
    jdbc.validationQuery=select 1 from dual

    项目异常时会抛出如下异常

    DBCP object created 2013-08-23 13:59:41 by the following code was never closed:
    java.lang.Exception
    	at org.apache.commons.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:157)
    	at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:76)
    	at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
    	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    	at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at net.bull.javamelody.JdbcWrapper$3.invoke(JdbcWrapper.java:742)
    	at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:271)
    	at $Proxy0.getConnection(Unknown Source)

    2、对DBCP的配置如下:
    #jdbc最大空闲连接数为0,每次应用获取连接时,直接向数据库获取连接,连接池不缓冲连接
    jdbc.maxIdle=0

    #是否让连接池自动回收泄露的连接,有连接泄漏也不回收
    jdbc.removeAbandoned=false
    3、用PLSQL登陆到应用连接的目标库
    使用如下SQL语句查看当前用户名下指定主机连接Oracle的情况
    select * from v$session where username='OPRISK' and machine='PC' 

    查询的目的在于找到指定主机,以指定用户名连接数据库的状况。

    如果查询时报错,看看报错信息,可能是没有权限,grant select on v_$session to <username>; 

    OPRISK    用户名(填写项目连接数据库时使用的用户名)
    PC        主机名(填写项目所在主机的主机名)
    PLSQL设置自动每秒刷新查询结果
    4、点击应用发送请求,
    如果发现发送某个请求后,PLSQL查到改连接而且连接一直存在,不关闭,说明,改请求导致了连接泄露。

    个人观点,期待探讨!

     

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    整理任正非思想:团结奋斗 再创华为佳绩-1994
    整理任正非思想:赴美考察散记-1994
    你不能不知道的六种 Python 图像库的图片读取方法总结
    Spring boot 2.0 Actuator 的健康检查
    Springboot启动后只能本地访问,无法通过外部IP访问
    Ironic 的 Rescue 救援模式实现流程
  • 原文地址:https://www.cnblogs.com/james1207/p/3281297.html
Copyright © 2020-2023  润新知