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解决:
5)数据库连接不够用
6)数据库连接使用超时