1.关于游标和statement的测试
代码如下:
String sql_test= "insert into tt (A) values (?)";
Connection conn=this.getConnection();
PreparedStatement ps = null;
try{ for (int i=0;i<1000;i++)
{ ps = this.getSession().connection().prepareStatement(sql_test);
ps.setInt(1,i);
ps.execute();
conn.commit();
}
}
finally{ if (ps != null) ps.close(); }
数据库(oracle)设置的open_cursor=300
此时执行,只能插入tt表300条记录,然后报ora-01000,游标数超出的错.
为什么finally中明明有关闭statement,但还是会报错呢?
原因是这样的:
在应用程序中,有一个Preparement对象ps,每次循环在执行ps = this.getSession().connection().prepareStatement(sql_test); 的时候,都会在数据库端打开一个cursor,如果应用程序不通过ps.close()来关闭,则数据库会保持这个游标打开.因此,上面的那段代码,看似已经关闭了ps,但实际上只关闭了最后一次循环的那个游标,之前的都没有关闭.正确的代码应该是在循环里面,conn.commit();之后加上ps.close();
2.关于apache日志.
今天早上两台应用服务器的apache都down掉了,原因原来是mod_jk.log日志超过了2G.解决方法是在配置文件中将mod_jk的输出级别设置为error,然后再把日志删除,重启就可以了.
没有评论:
发表评论