作者:蓝色雨 EMAIL:xiao7788@126.com qq:89062647
之前用jdbc直接连接的时候只关闭了PreparedStatement和Connection,但使用了C3P0之后就报ORA-01000: maximum open cursors exceeded错误,开始以为是数据库的open_cursors参数需要优化,但是当我把open_cursors默认的300改为1000后还是报这个错误,我看了C3P0的示例中都有关闭ResultSet,我才明白我的问题是没有关闭ResultSet
根本原因:
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。