某局Weblogic 连接池问题(现场报告)(Connection has been administratively disabled. Try later.)

目录

1. 概述 3

1.1 概述: 3

1.2 系统信息: 3

2. 连接池问题 5

2. 1 问题描述 5

2.2 错误日志分析 5

2.3连接池问题总结 14

3. 其他问题 14

3. 1 部署 14

3. 1 部署类型 15

 

1. 概述

1.1 概述:

应客户的要求,某局BATCH系统存在的问题进行诊断。经过日志分析及故障现象定位造成问题的原因,形成此份报告。

为了提供系统的稳定和性能,建议针对性的修改一些参数(会在报告中详述),在下次重启Server时付诸实施。如果需要疑惑的问题,

1.2 系统信息:

1) 版本信息

WebLogic Version:WebLogic Server Temporary Patch for CR370091 Tue Jul 08 17:31:21 EDT 2008 WebLogic Server Temporary Patch for CR370915 Tue Jul 15 14:36:25 IST 2008 WebLogic Server 10.0 MP1 Thu Oct 18 20:17:44 EDT 2007 1005184

Java Version:IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423-20071007 (JIT enabled)

2) 架构信息

各节点属于单独被管节点,未在同一集群中

3) 连接池配置

4) 故障连接池SCDS配置

 

 

2. 连接池问题

2. 1 问题描述

 

如上图所示SCDS连接池,在Weblogic服务启动后,BATCH4节点连接池不能按预期配置的初始建立80个连接。服务运行一段时候间后Current Capacity容量保持在40左右,运行一段时间后部分业务不可用,必须重启服务。查看中间件后台日志信息,发现日志中存在大量与连接池错误有关日志。

2.2 错误日志分析

1)网络闪断问题

####<2014-8-23 上午01时41分37秒 GMT+08:00>    <BATCH4> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <> <1408729297399>  SCWWDS4" failed with exception: "java.sql.SQLException: Io 异常: Connection reset".> 

####<2014-9-3 上午02时52分43秒 GMT+08:00>     <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <> <1409683963815>  

####<2014-9-5 上午12时55分00秒 GMT+08:00>      <> <> <> <1409849700178>   

####<2014-9-13 上午01时33分30秒 GMT+08:00>     <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <> <> <> <1410543210281>   

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

2)物理连接关闭

Weblogic Server日志:

####<2014-9-5 上午02时10分12秒 GMT+08:00>     <Thread-2574368> <> <> <> <1409854212313>   

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

972102: 0E9F01ITRG2C594F: 220809998 INFO cn.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)连接池参数不合理

Weblogic Server日志:

#####<2014-9-15 上午09时10分58秒 GMT+08:00>      <> <> <> <1410743458081>  <Created "1" resources for pool "SCDS", out of which "1" are available and "0" are unavailable.> 

在Weblogic Server日志中可以观察到大量的上述信息,表示系统业务高峰期时大量创建连接,另与现场工程师沟通发现出现过Reached maximum capacity of pool信息。可以看出当前连接池参数设置稍有不合理之处,建议将连接池最大值调整为120,步增长调整为5。

4)连接泄露

Weblogic Server日志:

####<2014-9-12 上午11时39分41秒 GMT+08:00>     <[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-

tuning)'> <> <> <> <1410493181108>  <Forcibly releasing inactive connection 

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

at weblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:291)

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

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

at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:425)

at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:316)

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

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

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

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

at weblogic.jdbc.jts.Driver.connect(Driver.java:124)

at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)

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

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

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

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

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

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

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

at cn.gwssi.common.dao.BaseTable.executeFunction(BaseTable.java:502)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

at jsp_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)

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

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

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

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

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

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

at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)

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

at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:394)

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

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

at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)

at cn.gwssi.filter.SecurityFilter.doFilter(SecurityFilter.java:35)

at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)

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

at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

at weblogic.security.service.SecurityManager.runAs(Unknown Source)

at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140)

at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046)

at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)

at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)

at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)

.>

 

####<2014-8-20 下午10时02分55秒 GMT+08:00>     <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-

tuning)'> <> <> <> <1408543375817>  orcibly releasing inactive connection 

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

at weblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:291)

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

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

at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:425)

at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:316)

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

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

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

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

at weblogic.jdbc.jts.Driver.connect(Driver.java:124)

at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)

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

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

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

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

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

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

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

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

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

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

at cn.gwssi.common.scheduler.ScheduleLog.startLog(ScheduleLog.java:134)

at cn.gwssi.common.scheduler.AbstractStatefulJob.beginTracer(AbstractStatefulJob.java:72)

at cn.gwssi.common.scheduler.AbstractStatefulJob.execute(AbstractStatefulJob.java:30)

at org.quartz.core.JobRunShell.run(JobRunShell.java:203)

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

.> 

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

WebLogic Server JDBC Connections Being Forcibly Released with Error BEA-001153: Forcibly releasing inactive connection (文档 ID 1329416.1)

 

问题原因及解决办法:

 

根据Oracle官方解释,造成该类问题主要原因为:业务系统代码程序获取数据库连接,当完成业务处理后,没有使用代码显式地对该连接进行关闭(即还回池中,并非关闭物理连接),从而导致分配出去的连接不能回收到连接池中进行重用,最后引发数据库连接不足,应用出现无法使用或响应缓慢的问题。建议开发人员检查上述红色标注代码的业务主线,将调用连接的代码编写finally语句块进行关闭处理。

5)连接池被Disabled

12493: null: 220830934 ERROR $plugin.dao.datasource.connect.oracle.OracleConnection.getTxnException  445 - gwssi==>Connection has been administratively disabled. Try later.

java.sql.SQLException: Connection has been administratively disabled. Try later.

at cn.gwssi.plugin.dao.datasource.connect.oracle.OracleConnection.getTxnException(OracleConnection.java:471)

at cn.gwssi.common.dao.ds.source.DBController.getStatement(DBController.java:390)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.DbHelper.executeRowSet(Unknown Source)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.ValidateForSFRT.getFeiYongZlmcBydm(Unknown Source)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.ValidateForSFRT.preCheckAndGetPreCondition(Unknown Source)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.BatchUseFeeForSFRT.useFeeRealTime(BatchUseFeeForSFRT.java:49)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.ScanFeeRealTime.txnScanFeeRTime(ScanFeeRealTime.java:34)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.ScanFeeRealTimeService.__callService(Unknown Source)

at cn.gwssi.cpees.d_sf.xml.importfeerealtime.ScanFeeRealTimeService.__doService(Unknown Source)

at cn.gwssi.common.txn.service.Step.process(Step.java:98)

at cn.gwssi.common.txn.service.Action.doService(Action.java:306)

at cn.gwssi.common.txn.service.Action.callService(Action.java:205)

at cn.gwssi.common.txn.iface.ActionUtil.callService(ActionUtil.java:57)

at cn.gwssi.common.scheduler.ControlJob.perform(ControlJob.java:69)

at cn.gwssi.common.scheduler.AbstractJob.execute(AbstractJob.java:30)

at org.quartz.core.JobRunShell.run(JobRunShell.java:203)

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

Caused by: 

java.sql.SQLException: Connection has been administratively disabled. Try later.

at weblogic.jdbc.common.internal.ConnectionEnv.checkIfEnabled(ConnectionEnv.java:770)

at weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:56)

at weblogic.jdbc.wrapper.Connection.preInvocationHandler(Connection.java:83)

at weblogic.jdbc.wrapper.Connection.createStatement(Connection.java:453)

at cn.gwssi.plugin.dao.datasource.db.wrap.ConnectionX.createStatement(ConnectionX.java:43)

at cn.gwssi.common.dao.ds.source.DBController.getStatement(DBController.java:384)

... 15 more

上述日志出现不久后,连接池被disabled,导致应用获取不到连接,大量线程等待数据库连接。见如下日志:

weblogic.jdbc.extensions.PoolDisabledSQLException: weblogic.common.resourcepool.ResourceDisabledException: Pool SCDS is disabled, cannot allocate resources to applications..

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

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

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

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

at cn.gwssi.plugin.dao.datasource.table.function.prepare.PrepareFunction.getSqlClause(PrepareFunction.java:48)

at cn.gwssi.common.dao.iface.SqlMethod.getStatement(SqlMethod.java:55)

at cn.gwssi.common.dao.method.SqlInsert.getSqlStatement(SqlInsert.java:77)

at cn.gwssi.common.dao.method.SqlInsert.doService(SqlInsert.java:104)

at cn.gwssi.common.dao.method.SqlInsert.execute(SqlInsert.java:125)

at cn.gwssi.common.dao.method.SqlInsert.execute(SqlInsert.java:137)

at cn.gwssi.cpees.d_sf.sflog.TxnAsyncLog.txn04scanfeert(Unknown Source)

at cn.gwssi.cpees.d_sf.sflog.TxnAsyncLogService.__callService(Unknown Source)

at cn.gwssi.cpees.d_sf.sflog.TxnAsyncLogService.__doService(Unknown Source)

at cn.gwssi.common.txn.service.Step.process(Step.java:98)

at cn.gwssi.common.txn.service.Action.doService(Action.java:306)

at cn.gwssi.common.txn.service.Action.callService(Action.java:205)

at cn.gwssi.plugin.jms.JmsTransaction.process1(JmsTransaction.java:174)

at cn.gwssi.plugin.jms.JmsTransaction.process(JmsTransaction.java:106)

at cn.gwssi.plugin.jms.AsyncService$Worker.run(AsyncService.java:91)

at java.lang.Thread.run(Thread.java:810)

Caused by: 

weblogic.jdbc.extensions.PoolDisabledSQLException: weblogic.common.resourcepool.ResourceDisabledException: Pool SCDS is disabled, cannot allocate resources to applications..

at weblogic.jdbc.common.internal.JDBCUtil.wrapAndThrowResourceException(JDBCUtil.java:241)

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

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

at weblogic.jdbc.jts.Driver.connect(Driver.java:124)

at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:339)

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

... 19 more

该问题属于Weblogic 在该版本已知bug,官方文档

java.sql.SQLException: Connection has been administratively disabled. Try later. (文档 ID 1211143.1) 对问题进行了详细的描述

问题版本与症状:

 

引起的原因:

 

引起该问题有两种原因:

(1)数据库不可用导致

(2)Weblogic bug导致

 

针对cause1,建议数据库工程师检查数据库,是否存在较为严重问题导致数据库中间件连接中断。

针对Cause2、Cause3建议为该版本Weblogic打Patch 8174835、 Patch 8188896补丁。

 2.3连接池问题总结

根据Oracle官方解释及日志表象,建议后续从以下几方面着手(后续操作建议按给出的先后顺序操作)。

(1)建议网络工程师排查网络,在近期是否有网络不稳定现象。

(2)建议让开发人员检查程序,不建议应用程序直接管理连接池的连接。

(3)建议数据库工程师检查数据库,排查数据库是否存在异常,是否存在较为严重问题导致数据库中间件连接中断。

(4)当前应用程序再使用SCDS数据源时存在连接泄露,建议开发商检查代码,编写finnally语句块进行处理。

(5)找到应用泄露点处理以后,根据Oracle官方文档ID 1211143.1建议为当前版本Weblogic打Patch 8174835、 Patch 8188896补丁。

(6)当前步增长值过小,业务高峰期时容易造成大量线程等待数据库连接,建议打补丁后先将步增长值由原来1个调整为5个。后续观察连接池使用情况,通过中间件控制台Service 》Data Source 》SCDS 》Monitor观察Active Connections High Count 属性,是否存在超过最大配置80现象,如若出现,势必会造成连接等待,建议由原来80增长为120.

 


你可能感兴趣的:(Weblogic)