我们正在将我们的应用服务器从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连接?
任何人都可以建议我更好的方式来解决上述问题??
您自动获得容器包装器连接,如果您使用Spring或其他框架,则不应该需要oracleConnection。我在这里没有看到这个问题,或者您没有将最后的解决方案的实际问题添加进去? – eis
(你可能会考虑将unwrapIfWLConnection重命名为unwrapConnection以匹配它实际正在做什么) – eis
对不起,我的问题可能会让你感到困惑,你是正确的,Spring提供了包装器连接,但在我们的最后,我们需要将它包装到许多Array描述符因此我们实现了一个javax.sql.DataSource getConnection方法,并配置spring以使用org.springframework.jndi来获取此连接。JndiObjectFactoryBean如此春天正在关闭oracle连接,我认为这是导致问题的原因。 – Shankar