当从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连接?
谁能给我建议更好的方法来解决上面的问题??
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不会在事务完成后释放连接。下面是堆栈跟踪: 池配置和事务配置如下: 如有任何建议,我将不胜感激