我们正在将我们的应用服务器从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连接?
有谁能建议我更好的方法来解决上述问题?
答案 0 :(得分:1)
spring给出了包装连接,但在我们最后我们需要它来包装 oracle连接为很多数组描述符操作所以我们 实现了javax.sql.DataSource getConnection方法并进行了配置 使用弹簧来获得此连接 org.springframework.jndi.JndiObjectFactoryBean因此春天正在关闭 我认为,oracle连接导致了这个问题。
确实,这导致了这个问题。不要这样做。
相反,让Spring和其他框架获得包装连接。仅在应用程序中需要数组描述符时才在代码中解包连接,否则让一切都使用容器提供的包装连接。