posts - 42,comments - 83,trackbacks - 0
      首先介绍一个JDBC参数InactiveConnectionTImeout,该参数用于强制回收那些被泄露的连接(长时间不使用的连接、未被程序正确释放的连接),避免连接池因为泄露导致无连接可用。当然该参数只是起辅助作用,解决问题知道还是在于完善应用程序。

      本文和该参数有关,早期的8.1\9.2中,设定该参数时,定时器(内部的连接池维护Task)只会清理那些长期未被使用的空闲连接(从名字上可以看出来),即对于运行一个长时间执行SQL的连接而言,它是不受影响的。但不知道从10.3哪个版本开始(我测试的是10.3.5),该参数对于长时间执行SQL的连接也进行强制回收了(这个比较不合理,虽然对于正在执行的Tx影响不大)。Debug了一下,发现SQL执行时间大于4*InactiveConnectionTimeout时,这个SQL执行完成时,会出现 <BEA-001153> <Forcibly releasing inactive connection "weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@1" back into the connection pool "TestDS", currently reserved by: java.lang.Exception这样的错误。

//该线程为内部Task执行线程,该线程目前处于被阻塞状态,等待SQL执行结束后回收连接
"[STUCK] ExecuteThread: '20' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=2 tid=0x2c4d3400 nid=0x1a14 waiting for monitor entry [0x
319bf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3896)
        - waiting to lock <0x0e6191d8> (a oracle.jdbc.driver.T4CConnection)
        at weblogic.jdbc.wrapper.Connection.forcedCleanup(Connection.java:156)
        at weblogic.common.resourcepool.ResourcePoolImpl.timeoutInactiveResources(ResourcePoolImpl.java:1955)
        at weblogic.common.resourcepool.ResourcePoolImpl.access$8(ResourcePoolImpl.java:1916)
        at weblogic.common.resourcepool.ResourcePoolImpl$ResourcePoolMaintanenceTask.timerExpired(ResourcePoolImpl.java:2680)
        at weblogic.timers.internal.TimerImpl.run(TimerImpl.java:273)
        at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:528)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

//该线程为应用执行线程,目前该线程SQL正在运行,他阻塞(阻塞对象为T4CConnection)了内部Task执行线程
"[STUCK] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=2 tid=0x2c7b4c00 nid=0x1100 runnable [0x2cf7e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        ......
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
        at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3677)
        - locked <0x0e6191d8> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
        at weblogic.jdbc.wrapper.PreparedStatement.execute(PreparedStatement.java:102)
        at com.bea.cs.test.jdbc.DriverTest.inactiveTimeoutTest(DriverTest.java:537)
        at jsp_servlet.__ds._jspService(__ds.java:86)

        从上面的线程堆栈可以看到,内部Task线程正在调用connection的rollback,即回滚连接上的本地事务。如果应用线程上使用的连接设为auto commit的话,该SQL执行不会被rollback,否则该SQL虽然执行完成也会被rollback调(全局事务中,某个事务分支使用的连接一定是非auto commit的),所以该问题对涉及全局事务的应用影响比较大。

        下面我们在看看连接被回收的时间点为什么会出现在3-4个InactiveConnectionTimeout之间。当内部Task执行,发现到了InactiveConnectionTimeout时间点后,它会调用timeoutInactiveResources()方法开始进行连接清理。那么为什么正在执行SQL的连接会被标志为非活动连接呢?这里涉及连接状态的三个标志位,分别为:conn_in_use,connUsed,hang_state,这三个标志位是其中的关键(getUsed()和setUsed()方法中会进行标志位操作及读取,如果对于某个连接getUsed()返回false的话,该连接会被清理)。下面我们看看其中标志位的变化过程: SQL开始执行时,preInvokeHandler会被这三个标志位进行设定。

初始值如下:
conn_in_use-->true
hang_state-->conn_state_in_use
connUsed-->true

第一次InactiveConnectionTimeout检查,getUsed返回true,同时调用setUsed(false),标志位变化如下:
conn_in_use-->true
hang_state-->conn_state_idle_suspect
connUsed-->true

第二次InactiveConnectionTimeout检查,getUsed返回true,同时调用setUsed(false),标志位变化如下:
conn_in_use-->false
hang_state-->conn_state_hang_suspect
connUsed-->false

第三次InactiveConnectionTimeout检查,getUsed返回true,
hang_state-->conn_state_in_use(从conn_state_hang_suspect变成conn_state_in_use)
同时调用setUsed(false),标志位变化如下:
conn_in_use-->false
connUsed-->false
hang_state-->conn_state_idle_suspect(从conn_state_in_use变成conn_state_idle_suspect)

第四次InactiveConnectionTimeout检查,getUsed返回false,开始回收该连接。

从上面的变化时间点可以看到从第一次到第四次检查经历了完整的3个InactiveConnectionTimout周期,而从SQL执行到第一次检查点,这个时间小于一个InactiveConnectionTimeout,所以连接开始被回收的时间点介于3-4个InactiveConnectionTimeout之间。




posted @ 2013-10-10 16:18 走走停停又三年 阅读(7553) | 评论 (1)编辑 收藏
     摘要: Weblogic10.3.0, connection pool, disable, Weblogic10.3.4, weblogic.resourcepool.max_test_wait_secs  阅读全文
posted @ 2011-03-22 14:45 走走停停又三年 阅读(2818) | 评论 (1)编辑 收藏
     摘要:   阅读全文
posted @ 2010-09-10 11:22 走走停停又三年 阅读(2199) | 评论 (5)编辑 收藏
     摘要: Weblogic92, connection pool, pinned-to-thread, max-capacity  阅读全文
posted @ 2009-12-22 15:52 走走停停又三年 阅读(2219) | 评论 (2)编辑 收藏
     摘要: Weblogic, Apache ,HALF_OPEN_SOCKET_RETRY,“No backend server available”  阅读全文
posted @ 2009-09-14 08:54 走走停停又三年 阅读(6590) | 评论 (5)编辑 收藏
     摘要: JVTM TI, class文件动态更新, 热部署  阅读全文
posted @ 2009-09-11 00:04 走走停停又三年 阅读(2764) | 评论 (5)编辑 收藏
     摘要: JVM TI、VirtualMachine、dt_socket、Weblogic、stuck thread、terminate  阅读全文
posted @ 2009-09-10 15:18 走走停停又三年 阅读(5943) | 评论 (6)编辑 收藏
     摘要: JDK、MBean、动态打开verbose class  阅读全文
posted @ 2009-09-08 09:46 走走停停又三年 阅读(2894) | 评论 (0)编辑 收藏
     摘要: Weblogic10, thread stuck, http, defaultReadTimeout,defaultConnectTimeout  阅读全文
posted @ 2009-08-29 23:15 走走停停又三年 阅读(3640) | 评论 (0)编辑 收藏
     摘要: weblogic92, connection pool, current capacity, initial capacity  阅读全文
posted @ 2009-08-29 23:15 走走停停又三年 阅读(7057) | 评论 (3)编辑 收藏
     摘要: Weblogic, Global Transaction(全局事务), MultiThread(多线程)  阅读全文
posted @ 2009-07-31 15:18 走走停停又三年 阅读(2425) | 评论 (0)编辑 收藏
     摘要: IBM JDK1.6 SR2 ClassFormatError: JVMCFRE068 类名无效  阅读全文
posted @ 2009-07-27 14:15 走走停停又三年 阅读(4046) | 评论 (0)编辑 收藏
     摘要: Weblgic92, ActiveMQ5.2 集成  阅读全文
posted @ 2009-07-10 15:07 走走停停又三年 阅读(2124) | 评论 (0)编辑 收藏
     摘要: Weblogic, JMS, Message Pending的问题  阅读全文
posted @ 2009-06-17 09:07 走走停停又三年 阅读(3831) | 评论 (9)编辑 收藏
     摘要: Weblogic92, JDBC Store引发的ORA-00001问题  阅读全文
posted @ 2009-06-16 09:03 走走停停又三年 阅读(2302) | 评论 (3)编辑 收藏
     摘要: Oracle, Undo, Redo, DataFile  阅读全文
posted @ 2009-06-11 17:50 走走停停又三年 阅读(1913) | 评论 (0)编辑 收藏
     摘要: Oracle, LogMiner, Redo Log, Transaction  阅读全文
posted @ 2009-06-09 13:39 走走停停又三年 阅读(2017) | 评论 (0)编辑 收藏
     摘要: Oracle9i, pfile, spfile, non-dynamic-parameters  阅读全文
posted @ 2009-06-08 15:42 走走停停又三年 阅读(1655) | 评论 (0)编辑 收藏
     摘要: Weblogic, JMS 消息状态解析  阅读全文
posted @ 2009-05-21 15:27 走走停停又三年 阅读(1614) | 评论 (0)编辑 收藏
     摘要: Procedure, In/Out parmeters, CallableStatement  阅读全文
posted @ 2009-05-08 13:19 走走停停又三年 阅读(1291) | 评论 (0)编辑 收藏
     摘要: Weblogic, JMS, FileStore, Consumer, MessageListener  阅读全文
posted @ 2009-04-22 09:35 走走停停又三年 阅读(4120) | 评论 (3)编辑 收藏
     摘要: 如何通过ldap browser监控weblogic server的embedded ldap server  阅读全文
posted @ 2009-04-14 15:32 走走停停又三年 阅读(2396) | 评论 (0)编辑 收藏
     摘要: 如果通过参数设定促使PermGen中的ClassUnloading,以避免PermGen的OOM  阅读全文
posted @ 2009-04-14 10:46 走走停停又三年 阅读(1340) | 评论 (1)编辑 收藏
     摘要: Weblogic, internal, transaction timeout, wakeUpAfterSeconds  阅读全文
posted @ 2009-02-24 10:54 走走停停又三年 阅读(3940) | 评论 (2)编辑 收藏
     摘要: Weblogic, RollbackException: SubCoordinator not available, TLog, CoordinatorDescriptor, ServerID  阅读全文
posted @ 2009-02-23 08:07 走走停停又三年 阅读(3312) | 评论 (7)编辑 收藏

        先后有客户碰到weblogic92, weblogic10.3在linxu上启动慢的问题。从thread dump来看,线程挂在security相关的随机数生成上面,因为客户没有把thread dump发过来,所以这里就没得贴了。
解决方法:
-Djava.security.egd=file:/dev/urandom(可能还会有问题)
-Djava.security.egd=file:/dev/zero(可以解决问题)

posted @ 2009-01-22 14:27 走走停停又三年 阅读(1363) | 评论 (0)编辑 收藏
     摘要: weblogic, XAER_NOTA, enlist  阅读全文
posted @ 2009-01-12 20:48 走走停停又三年 阅读(3133) | 评论 (0)编辑 收藏
     摘要: Weblogic中的load banlance问题   阅读全文
posted @ 2009-01-12 20:08 走走停停又三年 阅读(4064) | 评论 (0)编辑 收藏
     摘要: HttpCompleteMessageTimeout, BEA-101083, BEA-101326  阅读全文
posted @ 2008-12-12 09:55 走走停停又三年 阅读(5338) | 评论 (2)编辑 收藏
     摘要: Weblogic中的asynchronous web service调用,关键词: web service, asynchronous , FutureResult, AsyncInfo, setResultListener  阅读全文
posted @ 2008-11-24 22:38 走走停停又三年 阅读(2774) | 评论 (1)编辑 收藏
     摘要: Weblogic执行transaction recover碰到的奇怪问题  阅读全文
posted @ 2008-11-23 19:55 走走停停又三年 阅读(2317) | 评论 (0)编辑 收藏
     摘要: Weblogic中几个可以通过反射配置属性的MBean  阅读全文
posted @ 2008-11-20 18:17 走走停停又三年 阅读(1644) | 评论 (0)编辑 收藏
     摘要: 解析DynamicServerList在Weblogic plugin(HttpClusterServlet)中的实现  阅读全文
posted @ 2008-11-13 13:48 走走停停又三年 阅读(2580) | 评论 (6)编辑 收藏
     摘要: 本文主要讨论通过JDBC调用SQL Server存储过程碰到的"java.sql.SQLException: [BEA][SQLServer JDBC Driver][SQLServer]The server failed to resume the transaction. Desc:******* 问题  阅读全文
posted @ 2008-10-28 19:38 走走停停又三年 阅读(8847) | 评论 (0)编辑 收藏
     摘要: weblogic-ejb-jar.xml的元素解析   阅读全文
posted @ 2008-10-10 23:42 走走停停又三年 阅读(3965) | 评论 (0)编辑 收藏
     摘要: Weblogic, Session, Persistence, JDBC, 性能问题  阅读全文
posted @ 2008-09-27 17:18 走走停停又三年 阅读(3640) | 评论 (2)编辑 收藏
     摘要: Weblogic, log rotation, i node number, Tivoli  阅读全文
posted @ 2008-09-27 14:05 走走停停又三年 阅读(2129) | 评论 (0)编辑 收藏
     摘要: Java, static, 递归, Class.forName(), Classloader  阅读全文
posted @ 2008-09-26 12:38 走走停停又三年 阅读(2338) | 评论 (3)编辑 收藏
     摘要: ClassNotFoundException,NoClassDefFoundError,区别   阅读全文
posted @ 2008-09-25 19:45 走走停停又三年 阅读(9645) | 评论 (5)编辑 收藏
     摘要: Weblogic, Dom4j, SAXParserFactpry,ZipFile.getEntry(), class loader. 本文阐述了weblogic中使用dom4j时,如何定义SAXParserFactory实现类的问题。  阅读全文
posted @ 2008-09-13 21:57 走走停停又三年 阅读(2903) | 评论 (1)编辑 收藏
     摘要: Weblogic, WLConnection, getVendorConnection, PreparedStatement cache, DDL, 本文阐述了在weblogic中使用了prepared statement cache的情况下,如果后台数据库因为DDL而导致表结构发生变化的时候,如何规避prepared statement导致的SQLException。  阅读全文
posted @ 2008-09-12 12:26 走走停停又三年 阅读(2068) | 评论 (1)编辑 收藏
     摘要: Jad, decompile, Runtime.getRuntime.exec(). 基于Jad的一个批量反编译jar的小工具。  阅读全文
posted @ 2008-09-11 18:26 走走停停又三年 阅读(2187) | 评论 (1)编辑 收藏