当前位置: 首页 > 知识库问答 >
问题:

在JBOSS 7.2中释放包装连接

陶鹏
2023-03-14

当从Oracle datasource获得连接时,我们使用appserver(weblogic/JBoss)特定的包装器将连接包装到Oracle连接,如下面所示。如果我们不包装它,我们将无法使用Oracle的特性,如ArrayDescriptors。我们应该改变我们的应用程序,使它们同时在weblogic和JBoss中工作。

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
}
   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个答案

南门野
2023-03-14

spring提供了包装连接,但在我们的最后,我们需要它包装到oracle连接,以便进行许多数组描述符操作,因此我们实现了javax.sql.DataSource getConnection方法,并配置spring使用org.springframework.jndi.jndiObjectFactoryBean获得此连接,因此spring关闭了oracle连接,我认为这是导致问题的原因。

事实上,这就是问题的根源。别这样。

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

 类似资料:
  • 问题内容: 我目前正在使用Boost.Python,希望获得一些帮助来解决棘手的问题。 语境 当C 方法/函数暴露给Python时,它需要释放GIL(全局解释器锁)以允许其他线程使用解释器。这样,当python代码调用C 函数时,解释器可以被其他线程使用。现在,每个C ++函数如下所示: 为了通过它来增强python,我这样做: 问题 该方案可以正常工作,但是这意味着没有充分理由依赖。理想情况下,

  • 我们使用Jersey(2.22.2版)执行REST请求,使用ApacheConnectorProvider和PoolightTPClientConnectionManager管理连接池。 是否有办法从租赁连接列表中手动释放连接? PoolingHttpClientConnectionManager提供了关闭过期和空闲连接的方法,但这将从可用连接列表中关闭和删除连接,这不是我要找的。 我想这样做的原

  • 问题内容: 我在Redis中存储json数据列表,并使用ServiceStack c#客户端访问它。我本质上是在管理自己的外键,在其中存储id,然后使用应用程序内部的接口从中提取ID ,然后从Redis获取基础json对象并将其打包为列表以返回其他部分我的申请。 我正在使用,因为我希望Redis可以托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Wind

  • 我正在使用spring rest模板发送与apache http client 4.2.1集成的rest请求。 由于需要向多个服务器发送请求,增加了PoolingClientConnectionManager来管理连接。 当系统运行几天后,我们发现连接达到了最大每路由设置。 打印日志如下所示保持活动的总数:0;分配路线:5选5;分配总数:100个中的5个 似乎由于某种原因,连接没有被释放。但是当我

  • 问题内容: 我遍历了一堆URL,对于每个URL,我都在执行以下操作: 第一个查询很好,第二个查询抛出此异常: 线程“主”中的异常java.lang.IllegalStateException:无效使用SingleClientConnManager:仍然分配了连接。在分配另一个之前,请确保释放连接。在org.apache.http.impl.conn.SingleClientConnManager。

  • C3P0不会在事务完成后释放连接。下面是堆栈跟踪: 池配置和事务配置如下: 如有任何建议,我将不胜感激