- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个在互联网上找不到的问题。
我正在尝试使用 ojdbc6 连接到数据库。我从 jndi 获取资源
<Resource name="jdbc/ds_conn" type="javax.sql.DataSource" maxTotal="10"
url="jdbc:oracle:thin:@someDB.com:1731/nameDB"
driverClassName="oracle.jdbc.OracleDriver"
connectionProperties="SetBigStringTryClob=true;
oracle.net.READ_TIMEOUT=5000;" password="pass" username="user"
maxWait="10000" maxIdle="300" maxActive="1000" auth="Container"/>
使用方法
public OracleConnection getConnection() throws OracleDatabaseReaderConnectionException, NamingException {
Context initialContext = null;
try {
initialContext = new InitialContext();
DataSource dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/ds_conn");
OracleConnection connection = (OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);
return connection;
} catch (NamingException | SQLException e) {
e.printStackTrace();
throw new OracleDatabaseReaderConnectionException(e.getMessage());
} finally {
if (initialContext != null) {
initialContext.close();
}
}
}
接下来我将执行查询
try (OracleConnection connection = getConnection();
OraclePreparedStatement preparedStatement = (OraclePreparedStatement) connection.prepareStatement(sqlQuery);
OracleResultSet resultSet = (OracleResultSet) preparedStatement.executeQuery()) {
//some actions
} catch (OracleDatabaseReaderConnectionException | SQLException | NamingException e) {
throw new OracleDatabaseReaderException(e.getMessage());
}
}
据我了解,连接到数据库并执行查询是常见的操作。
但是连接没有关闭。正如你在我的 jndi 中看到的,我有参数 maxTotal="10"。因此,在 10 个查询之后,池已满,其他查询只是在等待池中的位置。我不知道如何解决这个问题并关闭连接。也许我在将 Connection 转换为 OracleConnection 等方面存在冲突?也许 thy-with-resources 效果不好?
最佳答案
问题是您要关闭内部 OracleConnection
而不是外部包装器。区别在于前者真正关闭连接,而关闭包装器只会将连接返回到池中。
(OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);
此处调用 unwrap()
会导致池包装器消失,并且您无法再对其调用 close
。解决此问题的一种方法是仅在启动 try-with-resources
后调用 unwrap()
,如下所示:
try (Connection connection = getConnection()) { // Now the pooled connection will be "closed"
OracleConnection oc = connection.unwrap(OracleConnection.class);
try(OraclePreparedStatement ps ...) ...
但这并不是很漂亮,至少如果您需要在很多地方这样做的话。这里是否绝对有必要使用 Oracle 特定类而不是 JDBC 接口(interface)?
关于java - 为什么 OracleConnection 没有返回到池中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689709/
这个问题在这里已经有了答案: ExecutorService, how to wait for all tasks to finish (16 个答案) 关闭 5 年前。 我有一个命令行应用程序。它
我正在使用池来启动 python3.6 中的工作进程。工作人员在完成后将返回 True 或 False,我想知道使用 AsyncResult 返回对象或使用回调函数来检查工作人员是否返回 True 或
环境:Ubuntu 上的 Node.js,以编程方式使用 PM2。 我已经通过我的主代码上的 Node 启动了具有 3 个实例的 PM2。假设我使用 PM2 命令行删除其中一个实例。我可以将另一个 w
我已将密码存储在 char 数组中,在检索它们时,我直接调用 String.ValueOf(char[] array) 方法。执行此操作会将形成的 String 存储在 String 池中。如果是,我
我是一名优秀的程序员,十分优秀!