Weblogic常见故障常:JDBC Connection Pools【转】

摘要:
atweblogic.jdbc.wrapper.JTAConnection.init(JTAConnection.java:90)atweblogic.jdbc.jta.DataSource.getConnection(DataSource.java:468)atweblogic.jdb.jta.DDataSource.connect(DataSource.java:

WebLogic Server中数据库连接池是一个经常出问题的地方,总结一下出问题的原因和解决办法。

一、数据库连接泄漏

此类问题一般都是由于开发人员没有正确关闭数据库连接造成的。比如使用完Connection后,没有调用Connection.close()方法。

1、诊断方法

在Console中,找到Connection Pools Tab 和Diagnostics,设置以下属性(不同版本可能略有区别)
Enable Connection Leak Profiling 启用连接池泄漏的监控。
Enable Connection Profiling 启用连接池监控。
Inactive Connection Timeout 100 表示100秒后强制回收无效连接。默认0,表示使用完才释放回连接池。
无需重启,查看server的log,查找“A JDBC pool connection leak was detected”,如果有,看看是哪个类引起的。下面是一个数据库连接泄漏的例子:
A JDBC pool connection leak was detected.
A connection leak occurs when a connection obtained from the pool was not closed explicitly by 
calling close() and then was disposed by the garbage collector and returned to the connection pool.
The following stack trace at create shows where the leaked connection was created.
Stack trace at connection create:
at weblogic.jdbc.wrapper.JTAConnection.init(JTAConnection.java:90)
at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:468)
at weblogic.jdbc.jta.DataSource.connect(DataSource.java:410)
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:344)
at troubleshooting.servlets.JdbcConnections.service(JdbcConnections.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1077)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:7047)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
问题解决后,把三个属性设置回先前的值。

2、解决方法


正确的关闭数据库连接。具体代码如下:

Connection conn = null;
ResultSet rs = null;
preparedStatement pss = null;
try {
  conn = dataSource.getConnection(USERID,pASSWORD);
  pss = conn.prepareStatement("SELECT SAVESERIALZEDDATA FROM SESSION.pINGSESSION3DATA WHERE 
  SESSIONKEY = ?");
  pss.setString(1,sessionKey);
  rs = pss.executeQuery();
  pss.close();
}
catch (Throwable t) {} 
finally {
 try 
 {
 if (conn != null) conn.close();
 } 
 catch (Exception e){}
}

二、数据库连接不够用

导致数据库连接不够用的原因主要有: ①某些程序占用connection时间过长,如果多个用户同时使用这些程序,则会导致连接不够用。 ②线程死锁,无法释放connection。

1、诊断方法

①监控参数:Waiting For Connection High Count [domain_name]-> Enviroment -> Servers -> [Server] -> Monitoring -> JDBC查看参数:Waiting For Connection 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 to applications, please increase the size of the pool and retry.. at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1493) at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:455) at weblogic.jdbc.jta.DataSource.connect(DataSource.java:410) at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:344) at troubleshooting.servlets.JdbcConnections.service(JdbcConnections.java:80) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1077) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:7047) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183) 如果此时观察connection的监控,会发现所有connection 都是Active,而且还有大量请求等待connection。

2、解决方法

①提高Maximum Capacity数量,该值一般略大于峰值情况下的数据库连接数。Services > JDBC > Connection Pools > BankConnectionPool > Configuration > Connections ②重点检查synchronize代码段和涉及数据库锁的代码。如果有必要,可以查看thread dump,看看线程在忙什么和等什么。

三、数据库连接使用超时

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

1、诊断方法

在Server Log中,明确有下列提示,并且在提示后抛出应用异常: Forcibly releasing inactive resource "weblogic.jdbc.common.internal.ConnectionEnv@132967d" back into the pool 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 JDBC Logging,并设置JDBC Log File Name。

完全引用 自: Weblogic常见故障常:JDBC Connection Pools

免责声明:文章转载自《Weblogic常见故障常:JDBC Connection Pools【转】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设计模式——责任链模式[小程序]微信小程序获取位置展示地图并标注信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

快速开发框架jeesite

在详细介绍jeesite之前,先说下本人对它的看法, jeesite官方说法“高效、高性能、强安全性 完全于开源、JavaEE快速开发平台”;但是鄙人认为,说高性能并不十分确切。咱不说其他他的,就说简单的首页访问,就比较缓慢,后台响应速度也并不是很快。但是作为我这种刚出道的秋儿学习,确实绰绰有余,但是鄙人是金牛座,就是不能忍,目前正在尝试提高响应速度,后面...

C# 创建ACCESS数据库(转载)

文章转自 http://www.cnblogs.com/luohoufu/archive/2008/04/10/1147136.html C#中怎么创建ACCESS数据库文件microsoft ado ext.2.8   我想利用C#创建一个ACCESS数据库文件(A.mdb)。请问用什么办法可以实现。 A.mdb文件是原来没有的,程序需要创建一个然后往里...

mssql2000数据库执行SQL语句来创建数据库以及数据表还有索引

mssql2000数据库执行SQL语句来创建数据库以及数据表还有索引 创建数据库MSsql2000Create DATABASE databasename on primary (name='databasename_data',filename='C:databasename_data.mdf',size=3mb,maxsize=UNLIMITED,fi...

单片机加密方法

                          单片机加密方法   在最近一个项目中,急急忙忙把功能完成就给了客户,完全没有安全意识,现在用烧录器把Flash里的程序一读,我就慌了,完全没有加密,随随便便就把程序读出来了,那我干了一个月的活,被人家花几秒钟读出来了,我这不是白干吗。因此,在这里普及一下安全意思,顺便介绍几种常见的加密方法。 一、打磨或更...

PLSQL配置怎么连ORACLE

如果是windows的话,在服务里面就可以查服务要启动,监听也要启动!可以用lsnrctl命令查看监听! 首先你需要在我的电脑的属性里,找到环境变量,配置系统下面的path,看看里面指向的是哪里(我的电脑里就有oracle的多个版本)而且要在你的oracle的X:oracleproduct10.2.0db_1 etworkADMIN nsnames.ora...

SQL Server 本地数据库登录不上 解决方法

sql本地数据库登录不了的话。先看看自己计算机 服务 SQL server  (MSSQLSERVER)  没有打开的话,请打开。 今天说的情景模式是  你误删了windows登录;禁用了sa登录;sa密码忘记了;或是你计算机名字被公司修改了,老的名字忘记了;又或是你用的别人的之前安装好的SQL数据库,终归,你本地数据库登录不了,用不了,拉了胯。   1...