ora-01000 超出打开游标的最大数

这是一个老问题,网上也有很多关于这个问题的原因和解决方法,一般都是说在循环里面使用PrepareStatement或ResultSet后没有及时关闭引起的。
我现在的问题是,我使用的是Sptring的Jdbctemplate来执行查询操作(我也看了Jdbctemplate的代码,甚至将源代码复制出来自己再添加输出信息,确定PerpareStatement确实是有关闭,奇怪的是似乎执行关闭的次数要少于实际执行查询的次数),所以我不能自己调用方法关闭PrepareStatement或ResultSet,那问题应该怎么解决呢?

附功能需求:
查询某些数据点(最大300个左右),在某个时间范围内(最大1年左右),哪一天没有数据。例如:查询300个点,在2013-04-10至2013-04-17日这10天之中,有多少是没有数据的,如果没有任何数据,则返回300*10=3000条数据,且这3000条数据必须有时间,如第1条的内容是“点A在2013-04-10没有数据”,第2条的内容是“点B在2013-04-10没有数据”...第XX条是“点A在2013-04-11没有数据”,以此类推。
上面这需求,除了将具体的时间赋值到SQL语句的查询条件中之外,没有想出其他方法。如果查询1年的时间范围,那就要执行360+条SQL语句,就会出现上面提到的错误。

通过oracle的connect by来产生日期临时表,然后关联你的业务表,进行分组查询,不是更简单么?如:
[code="java"]
select (to_date('2012-12-01', 'yyyy-mm-dd') + level - 1) as create_time
from dual
connect by level <=
to_date('2013-05-01', 'yyyy-mm-dd') -
to_date('2012-12-01', 'yyyy-mm-dd') + 1
[/code]
这也是前面某位想出来的,或许你可以用到

你现在需求就是确定在一个时间段内有没有数据

如果你是 年月日 存放的 可以这样
1、查询所有不重复的时间段
2、在程序中从第一天 循环到最后一天 看看【1】中有没有

一条语句就能搞定吧,你只要见一个时间段维表,比如是DATE_CFG,有有个存日期的字段,如存 20130101-2013131231,再来一个数据点维表,该表必须包含数据点的唯一标识,即可用下面的语句求各数据点在某时间段内没数据的总数:

SELECT COUNT(*) CNT, T2.数据点唯一标识, T2.数据点名称
FROM (SELECT 数据点唯一标识, B.日期 FROM 数据点维表表 A,日期维表 B WHERE B.日期>=20130101 AND B.日期<=20130501) T1
LEFT JOIN 主表 T2 ON T1.数据点唯一标识 = T2.数据点唯一标识
WHERE T2.数据点唯一标识 IS NULL
GROUP BY T2.数据点唯一标识, T2.数据点名称

各数据点在某时间段内没数据的详情:
SELECT T1.日期, T2.数据点唯一标识, T2.数据点名称
FROM (SELECT 数据点唯一标识, B.日期 FROM 数据点维表表 A,日期维表 B WHERE B.日期>=20130101 AND B.日期<=20130501) T1
LEFT JOIN 主表 T2 ON T1.数据点唯一标识 = T2.数据点唯一标识
WHERE T2.数据点唯一标识 IS NULL