Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么OracleConnection不是';你没有回到游泳池吗?_Java_Database_Oracle_Connection_Ojdbc - Fatal编程技术网

Java 为什么OracleConnection不是';你没有回到游泳池吗?

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

我有一个在互联网上没有发现的问题

我正在尝试使用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="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目的,如果您无法解决这个问题,我会感到惊讶。然而,如果你不在任何地方都这样做,这其实并不重要。