gpt4 book ai didi

java - 释放 JBOSS 7.2 中的包装连接

转载 作者:行者123 更新时间:2023-12-01 13:13:24 24 4
gpt4 key购买 nike

我们正在将应用程序服务器从 Weblogic 迁移到 JBoss,我们面临 Jboss 管理的数据源的问题,该问题没有关闭 Ironjacamar 包装的连接。

环境:Jboss 7.2、Ironjacamar 1.0.15、Oracle 11G

从 Oracle 数据源获取连接时,我们使用应用程序服务器(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;
}

每当需要连接时,我们都会调用数据源,如下所示:

//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 连接?

有人可以建议我更好的方法来解决上述问题吗?

最佳答案

spring gives wrapper connection but at our end we needed it to wrap to oracle connection for many Array descriptor operation so we implemented a javax.sql.DataSource getConnection method and configured spring to get this connection using org.springframework.jndi.JndiObjectFactoryBean so spring is closing oracle connection which ,i think , is causing the issue.

确实,这就是导致问题的原因。不要这样做。

相反,让 Spring 和其他框架获取包装的连接。仅当您的应用程序和代码中需要数组描述符时才打开连接,否则让所有内容都使用容器提供的包装连接。

关于java - 释放 JBOSS 7.2 中的包装连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com