gpt4 book ai didi

java - 为什么 OracleConnection 没有返回到池中?

转载 作者:行者123 更新时间:2023-12-02 02:12:56 27 4
gpt4 key购买 nike

我遇到了一个在互联网上找不到的问题。

我正在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com