释放JBOSS 7.2中的Wrapped连接

时间:2014-03-26 09:49:10

标签: java jboss jboss7.x datasource connection-pooling

我们正在将我们的应用服务器从Weblogic迁移到JBoss,我们正面临着由Jboss管理的Datasource的一个问题,即没有关闭Ironjacamar包裹的连接。

Environament:Jboss 7.2,Ironjacamar 1.0.15,Oracle 11G

在从Oracle数据源获取连接时,我们使用appserver(Weblogic / Jboss)特定的包装器将连接包装到Oracle Connection。如果我们不包装它,我们就不能使用像ArrayDescriptors这样的oracle功能。我们应该改变我们的应用程序,使它们在weblogic和jboss中都能正常工作。

Connectionutil.java:

public static Connection getConnection(String jndiName) throws NamingException, SQLException {
    InitialContext initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource dataSource = (DataSource) envContext.lookup(jndiName);
    Connection connection = dataSource.getConnection();
    connection= unwrapConnection(connection);
    return connection;
}



private static Connection  unwrapConnection(Connection connection) throws SQLException {
    if(isWeblogic) {
        if(connection instanceof weblogic.jdbc.extensions.WLConnection) {
            System.out.println("Datasource is maintained by Weblogc so Unwarping Weblogic JDBC Connection to oracle.jdbc.OracleConnection. Driver name is " + connection.getMetaData().getDriverName());
            return (oracle.jdbc.OracleConnection) ((weblogic.jdbc.extensions.WLConnection) connection).getVendorConnection();
        }
    } else if(isJboss) {
        if(connection instanceof org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6) {
            System.out.println("Datasource is maintained by Jboss so Unwarping Jboss JDBC Connection to oracle.jdbc.OracleConnection. Driver name is " + connection.getMetaData().getDriverName());
            return (oracle.jdbc.OracleConnection) ((org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6) connection).getUnderlyingConnection();
        }
    }

    // log.debug("{called getConnection(non weblogic type) - " + connection.getMetaData().getDriverName() + "}");
    return connection;
}

每当需要连接时,我们将调用Datasource,如下所示:

//some code 
connection = Connectionutil.getConnection("jdbc/SomeDS");


finally()
{
connection.close();//closing the connection
}

这里的问题是,即使在从客户端关闭连接之后,如果请求新连接,jboss池也不会释放连接,池正在提供其他可用连接,直到池耗尽(maxCOnnections)而不重用已关闭的连接。我希望jboss连接池管理器能够管理它没有发生的连接。

我在Jboss社区找到了类似上述问题的解决方案:  https://community.jboss.org/thread/72958?start=0&tstart=0我们能够解决以下独立应用程序的问题。

   Connection logicalConnection= dataSource.getConnection();//got the connection from DS

Connection oracleConnection= Connectionutil.unwrapConnection(connection );//unwrapping and wrappig to oracle connection

//some code 

    {
    finally()
    {
    logicalConnection.close;// here closing logical connection instead of oracle connection. Then jboss is reusing the connections.
    }

但是在J2EE应用程序使用管理连接打开和关闭的spring之类的框架的情况下,在这种情况下我不明白如何获得容器包装连接而不是像上面那样的oracle连接?

有谁能建议我更好的方法来解决上述问题?

1 个答案:

答案 0 :(得分:1)

  

spring给出了包装连接,但在我们最后我们需要它来包装   oracle连接为很多数组描述符操作所以我们   实现了javax.sql.DataSource getConnection方法并进行了配置   使用弹簧来获得此连接   org.springframework.jndi.JndiObjectFactoryBean因此春天正在关闭   我认为,oracle连接导致了这个问题。

确实,这导致了这个问题。不要这样做。

相反,让Spring和其他框架获得包装连接。仅在应用程序中需要数组描述符时才在代码中解包连接,否则让一切都使用容器提供的包装连接。