Java 为什么OracleConnection不是';你没有回到游泳池吗?
我有一个在互联网上没有发现的问题 我正在尝试使用ojdbc6连接到DB。我从jndi获得资源Java 为什么OracleConnection不是';你没有回到游泳池吗?,java,database,oracle,connection,ojdbc,Java,Database,Oracle,Connection,Ojdbc,我有一个在互联网上没有发现的问题 我正在尝试使用ojdbc6连接到DB。我从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="SetBigStringT
<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"/>
接下来我执行查询
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());
}
}
据我所知,连接到db并执行查询是常见的操作
但连接并没有关闭。正如您在我的jndi中看到的,我有param maxTotal=“10”。所以,在10次查询之后,查询池变得满了,而其他查询只是在等待池中的一个位置。我不知道如何解决此问题并关闭连接。也许我在与OracleConnection建立连接等方面存在冲突?也许您的资源管理器工作不好?问题是您关闭的是内部
OracleConnection
,而不是外部包装器。区别在于前者确实关闭了连接,而关闭包装器只会将连接返回到池
(OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);
这里调用
unwrap()
会导致池包装器消失,并且您不能再对其调用close
。解决此问题的一种方法是仅在启动尝试使用资源后调用展开()
,如下所示:
try (Connection connection = getConnection()) { // Now the pooled connection will be "closed"
OracleConnection oc = connection.unwrap(OracleConnection.class);
try(OraclePreparedStatement ps ...) ...
但这不是很漂亮,至少如果你需要在很多地方这样做的话。这里绝对有必要使用Oracle特定类而不是JDBC接口吗?问题是您关闭的是内部OracleConnection而不是外部包装器。区别在于前者确实关闭了连接,而关闭包装器只会将连接返回到池
(OracleConnection) dataSource.getConnection().unwrap(OracleConnection.class);
这里调用unwrap()
会导致池包装器消失,并且您不能再对其调用close
。解决此问题的一种方法是仅在启动尝试使用资源后调用展开()
,如下所示:
try (Connection connection = getConnection()) { // Now the pooled connection will be "closed"
OracleConnection oc = connection.unwrap(OracleConnection.class);
try(OraclePreparedStatement ps ...) ...
但这不是很漂亮,至少如果你需要在很多地方这样做的话。这里绝对有必要使用Oracle特定的类而不是JDBC接口吗?尝试使用资源
最后只调用connection.close()
。你有没有遇到任何错误或异常?如果是,请share@Afgan不幸的是,没有任何例外。新的连接正在无休止地等待,毫无例外。根据您的代码,我在任何地方都没有看到您有密切的连接或not@Afgan,我使用try with resources(第三个代码示例)。它在块尝试后自动关闭。try with resources
最后只调用connection.close()
。你有没有遇到任何错误或异常?如果是,请share@Afgan不幸的是,没有任何例外。新的连接正在无休止地等待,毫无例外。根据您的代码,我在任何地方都没有看到您有密切的连接或not@Afgan,我使用try with resources(第三个代码示例)。它在试块后自动关闭。回答不错,tnx。使用OraclePreparedStatement是绝对必要的。我需要preparedStatement.setStringAtName(..)和preparedStatement.setNullAtName(..)等方法。@Adey如果您将这些方法用于CLOB目的,如果您无法解决这个问题,我会感到惊讶。然而,如果你不在任何地方都这样做,这其实并不重要。回答不错,tnx。使用OraclePreparedStatement是绝对必要的。我需要preparedStatement.setStringAtName(..)和preparedStatement.setNullAtName(..)等方法。@Adey如果您将这些方法用于CLOB目的,如果您无法解决这个问题,我会感到惊讶。然而,如果你不在任何地方都这样做,这其实并不重要。