2014-03-26 53 views
0

我们正在将我们的应用服务器从Weblogic迁移到JBoss,我们正面临着由Jboss管理的数据源的问题,该问题未关闭Ironjacamar包装连接。释放JBOSS 7.2中的包装连接

Environament:Jboss的7.2,Ironjacamar 1.0.15,甲骨文11G

尽管取得从我们使用包装应用程序服务器(的Weblogic/Jboss的)特定的包装等below.If我们别到Oracle连接连接的Oracle数据源连接我们不会使用像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应用程序的情况下,我不明白如何让容器包装的连接,而不是在这种情况下,像上面的Oracle连接?

任何人都可以建议我更好的方式来解决上述问题??

+0

您自动获得容器包装器连接,如果您使用Spring或其他框架,则不应该需要oracleConnection。我在这里没有看到这个问题,或者您没有将最后的解决方案的实际问题添加进去? – eis

+0

(你可能会考虑将unwrapIfWLConnection重命名为unwrapConnection以匹配它实际正在做什么) – eis

+0

对不起,我的问题可能会让你感到困惑,你是正确的,Spring提供了包装器连接,但在我们的最后,我们需要将它包装到许多Array描述符因此我们实现了一个javax.sql.DataSource getConnection方法,并配置spring以使用org.springframework.jndi来获取此连接。JndiObjectFactoryBean如此春天正在关闭oracle连接,我认为这是导致问题的原因。 – Shankar

回答

1

春天给人的包装连接,但在我们结束我们需要它换到许多阵列描述操作 Oracle连接,所以我们 实施javax.sql.DataSource的getConnection方法和配置 春季开始使用 此连接org.springframework.jndi.JndiObjectFactoryBean所以春天正在关闭 甲骨文连接,我认为,这是造成这个问题。

的确,这是造成这个问题。不要这样做。

相反,让Spring和其他框架得到包装连接。只需在代码中需要应用中的数组描述符时解开连接,否则让所有内容都使用容器提供的封装连接。

+0

感谢您的建议eis – Shankar

+0

保存我的周末。谢谢! – walterpaoli