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()这种方式来关闭吧,不知道你那种方式会不会有问题
补充:企业软件 , 中间件