我在preparedStatement中面临问题。每次创建和执行preparedStatement时,打开游标计数都会增加,并且不会降低。 我每次执行结束后都会结束结果 为了确保由于其他一些代码而没有发生事情,我创建了一个简单的jsp并在其中执行代码。
Connection connection = null;
Set<Long> prodIds = new HashSet<Long>();
prodIds.add(5877462198L);
prodIds.add(782414147L);
prodIds.add(5547149987L);
prodIds.add(550424780L);
prodIds.add(5547045538L);
prodIds.add(5883926198L);
prodIds.add(5537432075L);
prodIds.add(81317072L);
prodIds.add(5618071249L);
prodIds.add(5630549908L);
prodIds.add(698964409L);
prodIds.add(822090000L);
prodIds.add(614679729L);
prodIds.add(5512339613L);
prodIds.add(81317068L);
prodIds.add(5688111900L);
prodIds.add(5512339611L);
prodIds.add(5894594380L);
prodIds.add(969040343L);
prodIds.add(827515204L);
prodIds.add(5626593095L);
prodIds.add(501511677L);
prodIds.add(1094656287L);
prodIds.add(5560791888L);
prodIds.add(641347103L);
prodIds.add(786034417L);
prodIds.add(774821382L);
prodIds.add(5599522282L);
prodIds.add(5591420268L);
prodIds.add(660541300L);
prodIds.add(82846941L);
prodIds.add(5529315772L);
prodIds.add(895683920L);
prodIds.add(5547045523L);
prodIds.add(801472476L);
prodIds.add(687163631L);
prodIds.add(5682795171L);
prodIds.add(5547045563L);
prodIds.add(687163630L);
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DataSources.getDefaultDataSource().getConnection();
out.println("connected....!!");
List<List<Long>> partitionedProductIdsList = Lists.partition(new ArrayList<Long>(prodIds), 1);
for (List<Long> productIdsList : partitionedProductIdsList) {
String sql = "SELECT * FROM RECLASSIFY_PRODUCTS_BULK_LOG WHERE product_id = " + productIdsList.get(0);
sql += "AND clsf_id = ? ";
PreparedStatement pstmt = null;
ResultSet rs = null;
int paramIndex = 1;
try {
pstmt = connection.prepareStatement(sql);
pstmt.setLong(paramIndex, 203L);
rs = pstmt.executeQuery();
while (rs.next()) {
out.println(rs.getLong("PRODUCT_ID"));
}
} catch (SQLException e) {
out.println("Exception : " + e.getMessage() + "");
} finally {
JdbcUtils.closeQuietly(rs, pstmt);
}
}
out.println("Closing the connection");
} catch (Exception e) {
out.println("Exception : " + e.getMessage() + "");
}
finally {
try {
connection.close();
}
catch (SQLException e)
{
out.println("SQLException : " + e.getMessage() + "");
}
}
以下是查询的结果: -
select a.value, s.username, s.sid, s.serial#
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current' and machine = 'v-b10' order by a.value desc
首先
VALUE USERNAME SID SERIAL#
610 UBDB 494 1485
4 UBDB 323 16275
2 UBDB 225 41357
0 UBDB 102 14729
加载jsp后
VALUE USERNAME SID SERIAL#
687 UBDB 494 1485
4 UBDB 323 16275
2 UBDB 225 41357
0 UBDB 102 14729
请帮助我,如果我在这里做错了,请告诉我。
答案 0 :(得分:1)
这是DBCP池中的一些问题,我们正在使用。以下jira票据也有报道。 https://issues.apache.org/jira/browse/DBCP-397
如果您仍想继续使用相同的池版本,则解决方法是要在PreparedStatement中传递where子句中使用的所有参数,或者只使用Statement代替它。
答案 1 :(得分:0)
您使用的JdbcUtils.closeQuietly(rs, pstmt)
无效。尝试手动关闭rs和stmt:
if(rs != null){
try{
rs.close();
}catch(Exception AllException){
AllException.printStackTrace();
}
}
if(pstmt != null){
try{
pstmt .close();
}catch(Exception AllException){
AllException.printStackTrace();
}
}
此外,为了从绑定机制中受益,您应该只在for
循环之外创建和关闭准备好的语句。