关于weblogic连接池爆满的原因和处理

网上了解了一下连接池泄露相关情况,各个地方根据自己情况拼凑了些。以后亲自处理时有啥感悟另谈吧。

描述:

weblogic连接池泄漏 简单来说也可以看作项目Overloaded。就是程序运行过程中创建一个连接,而在执行之后有可能没有释放该连接,当然,还有其他某些原因。这样的话,不管你项目配置的最大连接是多少,终将会溢出。然后项目始终与数据库连接不上。

 

在数据库查问题:

Oracle V$SESSION详解

STATUS:这列用来判断session状态是:

Achtive:正执行SQL语句(waitingfor/using a resource)

Inactive:等待操作(即等待需要执行的SQL语句)

Killed:被标注为删除

Session信息

SIDSESSION标识,常用于连接其它

SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)

USERNAME:当前sessionoracle中的用户名。

Client信息:数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息

OSUSER  客户端操作系统用户名

MACHINE:客户端执行的机器

TERMINAL:客户端运行的终端

PROCESS:客户端进程的ID

PROGRAM:客户端执行的客户端程序

要显示用户所连接PCTERMINALOSUSER,需在该PCORACLE.INIWindows中设置关键字TERMINALUSERNAME

 

 

 

查询连接异常情况:

查询当前占用数据库连接较多的主机和登录用户名
select count(*),SCHEMANAME,machine from v$session group by SCHEMANAME,machine;

如果某一主机占用连接数很大,明显不正常,进一步,检查造成这种情况的sql(最近执行过的):

selectcount(*),v.PREV_SQL_ADDR,v.PREV_HASH_VALUE from v$session v group byv.PREV_SQL_ADDR,v.PREV_HASH_VALUE order by count(*) desc ;

 

查询相关的SQL内容:

select * from v$sql s wheres.ADDRESS='C0000013B7BE85D8' and s.HASH_VALUE='32127143';

定位到sql后,修改未关闭连接处。

 

看日志查问题:

1)网络闪断问题

####<2014-8-23 上午014137 GMT+08:00> <Error><JDBC> <nw_cpees_pichuli_3> <BATCH4> <[ACTIVE]ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'><<WLS Kernel>> <> <> <1408729297399><BEA-001112> <Test "SELECT 1 FROM DUAL" set up for pool"SCWWDS4" failed with exception: "java.sql.SQLException: Io 异常: Connection reset".>

####<2014-9-3 上午025243 GMT+08:00> <Error><JDBC> <nw_cpees_pichuli_3> <BATCH4> <[ACTIVE]ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'><<WLS Kernel>> <> <> <1409683963815><BEA-001112> <Test "SELECT 1 FROM DUAL" set up for pool"SCWWDS4" failed with exception: "java.sql.SQLException: Io 异常: Connection reset".>

####<2014-9-5 上午125500 GMT+08:00> <Error><JDBC> <nw_cpees_pichuli_3> <BATCH4><Sched_cpees_Worker-32> <<anonymous>> <> <><1409849700178> <BEA-001112> <Test "SELECT 1 FROMDUAL" set up for pool "SCWWDS4" failed with exception:"java.sql.SQLException: Io 异常: Connection reset".>

####<2014-9-13 上午013330 GMT+08:00> <Error><JDBC> <nw_cpees_pichuli_3> <BATCH4> <[ACTIVE]ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'><<WLS Kernel>> <> <> <1410543210281><BEA-001112> <Test "SELECT 1 FROM DUAL" set up for pool"SCWWDS4" failed with exception: "java.sql.SQLException: Io 异常: Connection reset".>

以上日志说明BATH4节点所使用的SCWWDS4连接池与数据库之间网络物理连接有闪断问题,可能存在网络不稳定状况,建议网络工程师在近期检查网络状况。

Connection reset:数据源连接异常

2)物理连接关闭

WeblogicServer日志:

####<2014-9-5 上午021012 GMT+08:00> <Info><JDBC> <nw_cpees_pichuli_3> <BATCH4> <Thread-2574368><<anonymous>> <> <> <1409854212313><BEA-001128> <Connection for pool "SCDS" closed.>

Weblogic Server日志中可以观察到大量的Connection for pool"SCDS" closed信息,表示系统在某一时刻会批量关闭一批连接,一般断掉物理连接会这么做(WebLogic 配置池收缩也会这么做,如果未配置的话默认为900s检查一次,从您的配置文件发现未配置池收缩)。从线程名称看,是应用程序的线程关闭了连接。且在应用日志发现有大量如下日志信息:

972102: 0E9F01ITRG2C594F: 220809998 INFOcn.gwssi.common.dao.ds.source.DBController(close:321) - [gwssi] 线程[972102]关闭数据库连接;连接时间:2014/09/15 08:30:20 143;关闭时间:2014/09/15 08:30:20 147

建议让开发人员检查程序,为什么要关闭物理连接。一般我们不建议应用程序直接管理连接池的连接,这些都是Weblogic自身管理的,不然容易造成混乱。应用程序只在需要时从连接池中获取连接,使用完成后调用connection.close()方法把连接还给池即可。(这里的close不是关闭连接物理连接,而是把连接还给连接池,以便应用程序再使用)

3)连接池参数不合理

WeblogicServer日志:

#####<2014-9-15 上午091058 GMT+08:00> <Info><Common> <nw_cpees_pichuli_3> <BATCH4> <Thread-973306><<anonymous>> <> <> <1410743458081><BEA-000628> <Created "1" resources for pool"SCDS", out of which "1" are available and "0"are unavailable.>

Weblogic Server日志中可以观察到大量的上述信息,表示系统业务高峰期时大量创建连接,另与现场工程师沟通发现出现过Reachedmaximum capacity of pool信息。可以看出当前连接池参数设置稍有不合理之处

4)连接泄露

WeblogicServer日志:

####<2014-9-12 上午113941 GMT+08:00> <Warning><JDBC> <nw_cpees_pichuli_3> <BATCH4> <[ACTIVE]ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-

tuning)'> <<WLS Kernel>> <><> <1410493181108> <BEA-001153> <Forcibly releasinginactive connection

"weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@3c296c5"back into the connection pool "SCDS", currently reserved by: java.lang.Exception

atweblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:291)

atweblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:314)

atweblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:292)

atweblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:425)

atweblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:316)

atweblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:93)

atweblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:106)

at weblogic.jdbc.pool.Driver.connect(Driver.java:149)

atweblogic.jdbc.jts.Driver.getNonTxConnection(Driver.java:642)

atweblogic.jdbc.jts.Driver.connect(Driver.java:124)

atweblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)

at cn.gwssi.plugin.dao.datasource.db.ConnectSourceImpl.getConnection(ConnectSourceImpl.java:166)

atcn.gwssi.common.dao.ds.UserConnectionPool.getConnection(UserConnectionPool.java:68)

atcn.gwssi.common.dao.ds.ConnectFactory.getConnection(ConnectFactory.java:73)

atcn.gwssi.plugin.dao.datasource.table.TableImpl.getConnection(TableImpl.java:105)

atcn.gwssi.common.dao.func.RegisterSqlRowset.executeSql(RegisterSqlRowset.java:58)

atcn.gwssi.common.dao.iface.DaoFunction.execute(DaoFunction.java:293)

at cn.gwssi.common.dao.BaseTable.invokeRegisterMethod(BaseTable.java:567)

atcn.gwssi.common.dao.BaseTable.executeFunction(BaseTable.java:502)

atcn.gwssi.app.codemap.cache.method.MethodCodeDefine.loadCodeData(MethodCodeDefine.java:234)

at cn.gwssi.app.codemap.cache.method.MethodCodeDefine.getCodeSet(MethodCodeDefine.java:204)

atcn.gwssi.app.codemap.txn.TxnCodeList.txnFFFF02(TxnCodeList.java:58)

atcn.gwssi.common.txn.service.TxnBrokerApp.getValueListFromDao(TxnBrokerApp.java:272)

at cn.gwssi.common.web.proxy.application.PojoClient.getValueListFromDao(PojoClient.java:101)

atcn.gwssi.common.web.proxy.application.ApplicationTransactionClient.getValueListFromDao(ApplicationTransactionClient.java:217)

atcn.gwssi.common.web.proxy.TxnClient.getValueListFromDao(TxnClient.java:455)

atcn.gwssi.common.web.tag.util.ListData.getValueListFromDao(ListData.java:369)

atcn.gwssi.common.web.tag.util.ListData.getParamList(ListData.java:243)

atcn.gwssi.common.web.tag.export.FieldTagDefinition.getValueList(FieldTagDefinition.java:436)

atcn.gwssi.common.web.tag.export.FieldTagDefinition.getValueList(FieldTagDefinition.java:413)

atcn.gwssi.common.web.tag.util.BaseFieldTag.getValueList(BaseFieldTag.java:282)

atcn.gwssi.common.web.tag.select.SelectFieldTag.prepareOptions(SelectFieldTag.java:496)

atcn.gwssi.common.web.tag.select.SelectFieldTag.prepareListData(SelectFieldTag.java:407)

atcn.gwssi.common.web.tag.select.SelectFieldTag.prepareElement_in(SelectFieldTag.java:356)

atcn.gwssi.common.web.tag.util.BaseFieldTag.prepareElement(BaseFieldTag.java:749)

atcn.gwssi.common.web.tag.theme.BlockTheme.prepareField(BlockTheme.java:316)

atcn.gwssi.common.web.tag.frame.GblockTag.prepareField(GblockTag.java:620)

atcn.gwssi.common.web.tag.frame.GblockTag.createField(GblockTag.java:551)

at cn.gwssi.common.web.tag.util.BaseFieldTag.createElement(BaseFieldTag.java:777)

atcn.gwssi.common.web.tag.select.SelectFieldTag.doEndTag(SelectFieldTag.java:375)

atjsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jsp__tag8(__query_45_tzscx.java:538)

at jsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jsp__tag5(__query_45_tzscx.java:412)

atjsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jsp__tag4(__query_45_tzscx.java:346)

atjsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jsp__tag1(__query_45_tzscx.java:241)

atjsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jsp__tag0(__query_45_tzscx.java:192)

atjsp_servlet._app._15_dwfw._rcgz._cepct.__query_45_tzscx._jspService(__query_45_tzscx.java:155)

at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)

atweblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)

atweblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)

at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)

atweblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:394)

atweblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:309)

at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)

atweblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)

atcn.gwssi.filter.SecurityFilter.doFilter(SecurityFilter.java:35)

atweblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)

at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3393)

atweblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

atweblogic.security.service.SecurityManager.runAs(Unknown Source)

atweblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)

atweblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)

atweblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)

atweblogic.work.ExecuteThread.execute(ExecuteThread.java:200)

atweblogic.work.ExecuteThread.run(ExecuteThread.java:172)

.>

 

####<2014-8-20 下午100255 GMT+08:00> <Warning><JDBC> <nw_cpees_pichuli_3> <BATCH4> <[ACTIVE]ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-

tuning)'> <<WLS Kernel>> <><> <1408543375817> <BEA-001153> <Forcibly releasinginactive connection

"weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@2f3223b"back into the connection pool "SCDS", currently reserved by:java.lang.Exception

atweblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:291)

atweblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:314)

at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:292)

atweblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:425)

atweblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:316)

at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:93)

atweblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:106)

atweblogic.jdbc.pool.Driver.connect(Driver.java:149)

at weblogic.jdbc.jts.Driver.getNonTxConnection(Driver.java:642)

atweblogic.jdbc.jts.Driver.connect(Driver.java:124)

atweblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)

atcn.gwssi.plugin.dao.datasource.db.ConnectSourceImpl.getConnection(ConnectSourceImpl.java:166)

at cn.gwssi.common.dao.ds.UserConnectionPool.getConnection(UserConnectionPool.java:68)

atcn.gwssi.common.dao.ds.ConnectFactory.getConnection(ConnectFactory.java:73)

atcn.gwssi.common.dao.ds.ConnectFactory.getConnection(ConnectFactory.java:52)

at cn.gwssi.common.ioc.component.DefaultDBConnection.getConnection(DefaultDBConnection.java:74)

atcn.gwssi.common.ioc.component.DefaultDBConnection.getConnection(DefaultDBConnection.java:91)

atcn.gwssi.common.dao.db.DBAccessor.getConnection(DBAccessor.java:64)

at cn.gwssi.common.dao.db.DBWriter.executeUpdate(DBWriter.java:51)

atcn.gwssi.common.dao.impl.BaseDAO.executeUpdate(BaseDAO.java:65)

atcn.gwssi.common.dao.impl.GWDAO.execute(GWDAO.java:42)

atcn.gwssi.common.scheduler.ScheduleLog.startLog(ScheduleLog.java:134)

atcn.gwssi.common.scheduler.AbstractStatefulJob.beginTracer(AbstractStatefulJob.java:72)

atcn.gwssi.common.scheduler.AbstractStatefulJob.execute(AbstractStatefulJob.java:30)

atorg.quartz.core.JobRunShell.run(JobRunShell.java:203)

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)

.>

从上述日志中可以看出,当前应用存在连接泄露。对该问题Oracle官方文档 ID1329416.1)对上述问题作出了具体解释,描述如下:

WebLogic Server JDBC ConnectionsBeing Forcibly Released with Error BEA-001153: Forcibly releasing inactiveconnection

解决:

注意在程序中的连接关闭要习惯地写入finally中。确保关闭。但注意,没有返回connection对象的方法,直接调用的方式,这样的连接是无法关闭的。

5)数据库连接不够用

导致数据库连接不够用的原因主要有:

①某些程序占用connection时间过长,如果多个用户同时使用这些程序,则会导致连接不够用。

②线程死锁,无法释放connection

1、诊断方法

①监控参数:Waiting For Connection High Count

[domain_name]-> Enviroment -> Servers-> [Server] -> Monitoring -> JDBC查看参数:Waiting ForConnection High Count

如果没有此参数,手工添加进来,该参数表示在没有可用连接的情况下,应用程序等待连接的最大个数。调整后的连接池最大值 = 调整前的连接池最大值 + Waiting For Connection High Count。一般来说,数据库连接池的大小与最佳并发用户数相当。

 

②在Server Log中,明确抛出下列异常:

java.sql.SQLException: Internal error:Cannot obtain XAConnection

weblogic.common.resourcepool.ResourceLimitException:No resources currently available in pool

BankConnectionPool to allocate toapplications, please increase the size of the pool and retry..

at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1493)

atweblogic.jdbc.jta.DataSource.getConnection(DataSource.java:455)

atweblogic.jdbc.jta.DataSource.connect(DataSource.java:410)

atweblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:344)

attroubleshooting.servlets.JdbcConnections.service(JdbcConnections.java:80)

atjavax.servlet.http.HttpServlet.service(HttpServlet.java:853)

atweblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1077)

atweblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)

atweblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)

at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:7047)

atweblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

atweblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)

atweblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)

atweblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)

atweblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)

atweblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

如果此时观察connection的监控,会发现所有connection 都是Active,而且还有大量请求等待connection

2、解决方法

①提高Maximum Capacity数量,该值一般略大于峰值情况下的数据库连接数。Services > JDBC > Connection Pools > BankConnectionPool> Configuration > Connections

②重点检查synchronize代码段和涉及数据库锁的代码。如果有必要,可以查看thread dumphttp://blog.csdn.net/rachel_luo/article/details/8920596http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html),看看线程在忙什么和等什么。

 

6)数据库连接使用超时

此类问题一般是由于某些数据库操作时间比较长,超过了Inactive connection timeout的设置。

1、诊断方法

Server Log中,明确有下列提示,并且在提示后抛出应用异常:

Forcibly releasing inactive resource"weblogic.jdbc.common.internal.ConnectionEnv@132967d" back into thepool BankConnectionPool".这里无法列出应用异常,因为每个应用都不一样,不过很有可能会抛出空指针异常,因为Connection被强制放回池中了,继续使用一个空对象会抛出该异常。

2、解决方法

在高级参数中,提高Inactive connection timeout数量。

Services > JDBC > Connection Pools> BankConnectionPool > Configuration > Connections

 

四、事务超时

此类问题一般是由于某些数据库操作时间比较长,超过了JTA Timeout Seconds的设置。

1、诊断方法

Server Log中,明确抛出异常:

weblogic.transaction.internal.TimedOutException:Transaction timed out after 300 seconds

2、解决方法

提高Services > JTA Configuration > Timeout Seconds数量。

注意这个参数应该小于Inactive connection timeout的值,因为事务必须在连接超时前完成。如果想分析究竟是哪些SQL语句导致事务超时,可以打开日志AdminServer > Logging > JDBC,选中Enable JDBCLogging,并设置JDBC Log File Name


参考地址:

http://blog.csdn.net/yangshangwei/article/details/51144709

http://blog.csdn.net/u011278012/article/details/51992811

http://blog.csdn.net/zhouleiblog/article/details/40506369

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值