Statement在JDBC编程中常常被用到,但却常常忽略。Statement本身是一个接口,有两个实现类:PreparedStatement和CallableStatement,通过connection.createStatement()创建实例。相对于connection和resuleset资源来说,statement实例很容易被忽略而没有即时释放它。下面就是一个会导致严重后果的例子:
java 代码
- for (;;;) {
- Statement sst = connection.createStatement();
- ... ...
- }
这样很容易产生“游标数用完”的错误,我曾坐过一个统计,在oracle数据库上,以上类型的代码在insert200多条记录时就报异常,而当把statement语句转移到for循环外面时就没有报异常,而且我一次性同步2000多条记录都没问题。
最后,还是想说那句话:任何打开的资源都应手工close掉,而不是等gc来清理,往往是在gc清理前资源已经耗尽。