gpt4 book ai didi

java - Resultset 和 CallableStatement 处理后未关闭

转载 作者:太空宇宙 更新时间:2023-11-04 13:01:52 26 4
gpt4 key购买 nike

我尝试在处理后关闭 ResultSetCallableStatement,但只有 Connection 正在关闭,其他两个没有。

final String procedureCall = "{call GET_PAWS_PERSON_DETAILS(?, ?)}";
try {

//Get Connection instance from dataSource
connection = dataSource.getConnection();
callableStatement = connection.prepareCall(procedureCall);
callableStatement.setString(1, userName);
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);

//Call Stored Procedure
callableStatement.executeUpdate();
// get cursor and cast it to ResultSet
resultSet = (ResultSet) callableStatement.getObject(2);
logger.debug("reslt" + resultSet.getFetchSize());
// loop it like normal
while (resultSet.next()) {
personDTO.setPersonID(resultSet.getString(1));
personDTO.setFirstName(resultSet.getString(2));
personDTO.setLastName(resultSet.getString(3));
personDTO.setFullName(resultSet.getString(4));
personDTO.setEmail(resultSet.getString(5));
}

}catch (SQLException e) {

e.printStackTrace();

} finally {
if(resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}

if(callableStatement != null)
try {
callableStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(connection != null)
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}

}

我正在使用这个代码。关闭后只需打印 ConnectionStatmentCallableStament。结果是

Connection : null
Resultset : org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@6f1f6b1e
Callable statement : oracle.jdbc.driver.OracleStatementWrapper@77b1b790.

由于此问题,数据库连接池的大小不断增加。

请给我解决方案。

在 Tomcat server.xml 中

<Resource driverClassName="oracle.jdbc.OracleDriver" maxActive="4" maxIdle="10" maxWait="5000" name="jdbc/epaws" global="jdbc/epaws" 
password="polusneu" type="javax.sql.DataSource" url="jdbc:oracle:thin:@192.168.1.60:1521:coeusnew"
username="polusneu" validationQuery="select 1 from dual" testOnBorrow="true" removeAbandoned="true"
removeAbandonedTimeout="55"/>

applicationcontext.xml

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/epaws"/>
<property name="resourceRef" value="true"/>
<property name="cache" value="false"/>
<property name="lookupOnStartup" value="false"/>
<property name="proxyInterface" value="javax.sql.DataSource"/>
</bean>

最佳答案

首先:

关闭对象不会将该对象引用设置为null。所以收盘后你仍然有对象是可以的。但奇怪的是你的连接应该是 null 之后......但无论如何。

finally block 中结束是有效的过程 - 但很老派。 Java 7 引入了一个名为 try-with-resource 的出色新功能,即使出现错误,它也会负责关闭。代码将如下所示

try(Connection con = dataSource.getConnection();
CallableStatement callable = con.prepareCall(procedureCall)) {

callableStatement.setString(1, userName);
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);

//Call Stored Procedure
callableStatement.executeUpdate();
// get cursor and cast it to ResultSet
try(ResultSet resultSet = (ResultSet) callableStatement.getObject(2)) {
logger.debug("reslt" + resultSet.getFetchSize());
// loop it like normal
while (resultSet.next()) {
personDTO.setPersonID(resultSet.getString(1));
personDTO.setFirstName(resultSet.getString(2));
personDTO.setLastName(resultSet.getString(3));
personDTO.setFullName(resultSet.getString(4));
personDTO.setEmail(resultSet.getString(5));
}
} //Don't need another catch
} catch(SQLException e) {
e.printStackTrace();
}

关于java - Resultset 和 CallableStatement 处理后未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869326/

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