[原创]Weblogic数据库连接功能完善_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3926 | 回复: 0   主题: [原创]Weblogic数据库连接功能完善        下一篇 
funny
注册用户
等级:中校
经验:1529
发帖:111
精华:4
注册:2013-3-13
状态:离线
发送短消息息给funny 加好友    发送短消息息给funny 发消息
发表于: IP:您无权察看 2014-2-21 14:32:47 | [全部帖] [楼主帖] 楼主


1.概述

在X月XX日局方反应缴费失败率高,协助XXX工程师进行问题排查,经排查发现ECS-Serv152 的数据库连接发生异常,下面就该问题进行分析并提出相关建议。

2.故障原因 

在发生故障时第一时间找到相关涉及系统并逐一排查,主要涉及的系统如下:

1、接口Tuxedo服务器,查看接口服务器发现并未出现服务堵塞的情况,

2、查看Weblogic相关服务器XXX和YYY,查看日志并未发现错误信息,但是查看ECS-Serv152标准输出文件时发现大量的SQL异常。下面是异常信息:

java.sql.SQLException: 关闭的连接

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:403)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3046)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:2961)
at oracle.jdbc.OracleConnectionWrapper.prepareStatement(OracleConnectionWrapper.java:105)
at weblogic.jdbc.wrapper.XAConnection.prepareStatement(XAConnection.java:617)
at weblogic.jdbc.common.internal.ConnectionEnv.makeStatement(ConnectionEnv.java:1338)
at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:1081)
at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:995)
at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:988)
at weblogic.jdbc.wrapper.Connection.prepareStatement(Connection.java:487)
at com.linkage.util.dbutil.DBBeanImpl.getPreparedStatement(DBBeanImpl.java:87)
at com.linkage.uip.processor.FilterUserInfoCMD.getFilterFlag(FilterUserInfoCMD.java:266)
at com.linkage.uip.processor.FilterUserInfoCMD.execute(FilterUserInfoCMD.java:87)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
at com.linkage.uip.processor.DefaultChain.execute(DefaultChain.java:150)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:166)
at com.linkage.uip.processor.DefaultChain.execute(DefaultChain.java:150)
at com.linkage.uip.processor.CommonDataProc.process(CommonDataProc.java:35)
at com.linkage.uip.receiver.HTTPDataReceiver.doPost(HTTPDataReceiver.java:552)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
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:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)


查看该错误最早的原因发现如下错误信息:

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
133.224.218.1:1521:crmdb1
at com.linkage.util.dbutil.OraConnectionBean.connect(OraConnectionBean.java:69)
at com.linkage.util.dbutil.DBBeanFactory.getDBBean(DBBeanFactory.java:35)
at com.linkage.util.dbutil.DBBeanFactory.getDBBeanByConfig(DBBeanFactory.java:96)
at com.linkage.iboss.thread.vpdn.VPDNPrvOrderCheckRespGetProcessor.getRequestList(VPDNPrvOrderCheckRespGetProcessor.java:159)
at com.linkage.iboss.thread.vpdn.VPDNPrvOrderCheckRespGetProcessor.process(VPDNPrvOrderCheckRespGetProcessor.java:131)
at com.linkage.util.thread.MULTIDoJobThd.runWork(MULTIDoJobThd.java:37)
at com.linkage.util.thread.CommonTHD.run(CommonTHD.java:147)


该错误并非标准的Weblogic日志信息,也就是说该异常Weblogic并未探查,而应用在申请连接时Weblogic内部分配给了已经被关闭的连接导致应用发生异常信息。重启服务后生效。

有以下几个疑点:

1、 在4月2日数据库一个节点发生异常宕机,而该数据源的连接TNS第一个节点即为宕机的节点;

2、 Weblogic并未探查到异常的数据库连接信息;

3、 查看错误信息发生前后与数据库宕机的时间比较吻合。

下面具体介绍JDBC申请流程来方便定位问题:

应用在申请数据库连接时,JDBC连接池会分配给一个空闲的连接给应用使用,应用拿到连接后进行业务逻辑并在结束时关闭连接,该连接被释放,放回到连接池中。

那么出现问题就在拿到连接的过程,在重启服务器后,虽然服务已经正常,但是在测试该数据源的时候发生异常:

北京联动北方科技有限公司

上面错误发生的原因可能有两点:

1、 测试语句错误,经查看并未发生异常

2、 未允许使用测试功能,查看高级配置后发现该功能并未开启。

那么出现该问题的主要原因就可以确定:在数据库故障后,Weblogic的重连机制出现异常,下面查看相关参数配置:

北京联动北方科技有限公司

未开启连接测试功能

北京联动北方科技有限公司

未开启连接失败重试功能

开启连接测试功能后,连接测试功能正常。

3.相关建议

经上面的查看,可以确定问题主要在于数据库故障或,Weblogic数据库连接池发生异常,由于未开启连接测试功能,导致Weblogic无法定期进行连接测试,从而使Weblogic并未探查到JDBC的异常,直接将以关闭的连接赋予了应用线程导致。而且在日志中也未发现在数据库宕机时出现的异常信息。

下面提出相关建议:

在数据源的配置页面的连接池配置功能:

北京联动北方科技有限公司

点开Advance选项:

1、将北京联动北方科技有限公司前打勾,开启连接测试功能,该选项会定时对数据库连接池进行连接测试,如果发生异常会记录到Weblogic日志中,一边定位问题。而且在应用申请连接时也会进行测试,只有连接可用时才会将连接赋予应用线程。该参数为默认参数,推荐配置。

2、对北京联动北方科技有限公司参数进行配置,例如30秒,则该参数的含义是在数据库连接失败后每隔30秒进行重试,而现在配置的值禁止了重连功能,也就是说如果连接创建失败后并不继续,直到下一次进行连接时。

配置上述参数将数据库连接功能进行完善,当数据库再次宕机时会进行测试连接,使应用得到可用的连接。

该贴被funny编辑于2014-2-21 14:34:52



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论