当前位置:编程学习 > 网站相关 >>

WebLogic10.3连接池泄漏

最近遇到一个很棘手问题,希望大家可以帮忙分析一下,非常感谢!
 
问题描述:
1.在WebLogic10.3的控制台下,我把Profile Connection Leak勾选上了,但是在Monitoring-->JDBC下的列表,Leaked Connection Count
数为0,日志文件也没有连接池泄漏等错误信息,不知道是什么原因造成连接泄漏监测不到?
2.在写代码测试Physical Connection的时候,在 
java.sql.Connection vendorConn=((WLConnection)conn).getVendorConnection(); 
vendorConnction=(oracle.jdbc.OracleConnection)vendorConn;
转成Physical Connection的时候报一下异常:
(我用的是Oracle数据库,JDBC驱动包我已经分别导入到项目和WebLogic-->Server-->lib中了)
weblogic.rmi.extensions.RemoteRuntimeException: Unexpected Exception
at weblogic.jdbc.rmi.internal.ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection_1033_WLStub.getVendorConnection(Unknown Source)
at weblogic.jdbc.rmi.SerialConnection_weblogic_jdbc_rmi_internal_ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection_1033_WLStub.getVendorConnection(Unknown Source)
at org.test.TestPool1.test(TestPool1.java:48)
at org.test.TestPool1.run(TestPool1.java:96)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.rmi.MarshalException: error marshalling return; nested exception is: 
java.io.NotSerializableException: oracle.jdbc.driver.LogicalConnection
at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:234)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:223)
... 5 more
Caused by: java.io.NotSerializableException: oracle.jdbc.driver.LogicalConnection
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
 
详细代码如下:
import java.io.Serializable;
import java.sql.*;
import java.util.Hashtable;
import javax.naming.*;
import weblogic.jdbc.extensions.WLConnection; 
public class TestPool1 implements Runnable,Serializable{
public TestPool1(){ }
oracle.jdbc.OracleConnection vendorConnction=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
//循环10个实例,创建多线程并发
            TestPool1 tp=new TestPool1();
            Thread td=new Thread(tp);
            td.start();
            for(int i=0; i<5; i++){
            //每次休眠1分钟去创建一个链接
            Thread.sleep(60000);
            new TestPool1().test();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
       }
     public void test(){
            Context cxt=null;
            Connection conn=null;
            Statement stm=null;
            ResultSet rs=null;
            Hashtable hs=new Hashtable();
            hs.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            hs.put(Context.PROVIDER_URL, "t3://192.168.0.101:7001");
try{ 
            cxt=new InitialContext(hs);
//从testPool数据源中取虚连接
            javax.sql.DataSource ds=(javax.sql.DataSource)cxt.lookup("testPool");
// conn=cxt.getJDBCConnection(ds);
            conn=ds.getConnection();
           //将虚连接转换成Physical Connection
            java.sql.Connection vendorConn=((WLConnection)conn).getVendorConnection(); 
vendorConnction=(oracle.jdbc.OracleConnection)vendorConn;
//使用Physical Connection对数据库进行查询操作
            stm=vendorConnction.createStatement();
            rs=stm.executeQuery("select * from a");
//取出数据
        while(rs.next()){
        String str=rs.getString(1)+" "+rs.getString(2); 
System.out.println(str);
            } 
//将Physical Connection置为NULL
        vendorConnction=null;
      //conn=null; 
        }catch(Exception e){ 
            e.printStackTrace();
        }
//为确保安全,在finally出确认vendorConn和conn是否置为了NULL,
finally {  
try { 
vendorConnction=null;
         cxt.close(); 
         } catch (Exception e) { 
         e.printStackTrace();
        }  
      try {     
     if (rs != null)
     rs.close();
    } catch (Exception e) {
     e.printStackTrace();
     }  try {
     if (stm != null)
     stm.close(); 
     } catch (Exception e) {
     e.printStackTrace();
 }
 try {
    if (conn != null)
 conn.close();
    } catch (Exception e) {
     e.printStackTrace();
 }
     }
    }
    public void run() {
/ / TODO Auto-generated method stub 
for(int i=0; i<2; i++){ 
new TestPool1().test();
}
    }
}
期待你们的回复,万分感谢!
--------------------编程问答-------------------- 不应该用置空这种方式来释放连接吧,应该是vendorConn.close()这种方式来关闭吧,不知道你那种方式会不会有问题
补充:企业软件 ,  中间件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,