weblogic连接池泄漏 简单来说也可以看作项目Overloaded。就是程序运行过程中创建一个连接,而在执行之后有可能没有释放该连接,当然,还有其他某些原因。这样的话,不管你项目配置的最大连接是多少,终将会溢出。然后项目始终与数据库连接不上。
STATUS:这列用来判断session状态是:
Achtive:正执行SQL语句(waitingfor/using a resource)
Inactive:等待操作(即等待需要执行的SQL语句)
Killed:被标注为删除
Session信息
SID:SESSION标识,常用于连接其它列
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)。
USERNAME:当前session在oracle中的用户名。
Client信息:数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER: 客户端操作系统用户名
MACHINE:客户端执行的机器
TERMINAL:客户端运行的终端
PROCESS:客户端进程的ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接PC的TERMINAL、OSUSER,需在该PC的ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。
查询当前占用数据库连接较多的主机和登录用户名
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后,修改未关闭连接处。
####<2014-8-23 上午01时41分37秒 GMT+08:00>
####<2014-9-3 上午02时52分43秒 GMT+08:00>
####<2014-9-5 上午12时55分00秒 GMT+08:00>
####<2014-9-13 上午01时33分30秒 GMT+08:00>
以上日志说明BATH4节点所使用的SCWWDS4连接池与数据库之间网络物理连接有闪断问题,可能存在网络不稳定状况,建议网络工程师在近期检查网络状况。
Connection reset:数据源连接异常
WeblogicServer日志:
####<2014-9-5 上午02时10分12秒 GMT+08:00>
在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不是关闭连接物理连接,而是把连接还给连接池,以便应用程序再使用)
WeblogicServer日志:
#####<2014-9-15 上午09时10分58秒 GMT+08:00>
在Weblogic Server日志中可以观察到大量的上述信息,表示系统业务高峰期时大量创建连接,另与现场工程师沟通发现出现过Reachedmaximum capacity of pool信息。可以看出当前连接池参数设置稍有不合理之处
WeblogicServer日志:
####<2014-9-12 上午11时39分41秒 GMT+08:00>
tuning)'> <
"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 下午10时02分55秒 GMT+08:00>
tuning)'> <
"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对象的方法,直接调用的方式,这样的连接是无法关闭的。
导致数据库连接不够用的原因主要有:
①某些程序占用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 dump(http://blog.csdn.net/rachel_luo/article/details/8920596、http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html),看看线程在忙什么和等什么。
此类问题一般是由于某些数据库操作时间比较长,超过了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