JFinal4.4,在Oracle下使用的时候程序运行一段时间后会遇到错误:“ORA-01000: 超出打开游标的最大数”,查看代码发现在com.jfinal.plugin.activerecord.DbPro类的save方法中,打开了PreparedStatement,在遇到保存错误的情况下,preparedStatement不会被正常关闭,导致会话游标一直被持有,希望在后续版本中能修复。save方法代码如下:
(Config configConnection connString tableNameString primaryKeyRecord record) SQLException { String[] pKeys = primaryKey.split()List<Object> paras = ArrayList<Object>()StringBuilder sql = StringBuilder()config..forDbSave(tableNamepKeysrecordsqlparas)PreparedStatement pst(config..isOracle()) { pst = conn.prepareStatement(sql.toString()pKeys)} { pst = conn.prepareStatement(sql.toString()Statement.)} config..fillStatement(pstparas)result = pst.executeUpdate()config..getRecordGeneratedKey(pstrecordpKeys)DbKit.(pst)result >= }
而 DbKit.close(connection) 是会将从 connection 中打开的 preparedStatement 一并关掉,理论上来说是没有问题的
当然,不排除有些数据库驱动或者数据源连接池没有保障 connection.close() 后自动关闭 preparedStatement
所以,jfinal 4.9 已经使用 JDK 7 加入的 try-with-resources 语法对这个地方加强了:
https://gitee.com/jfinal/jfinal/commit/ea4eeefbc4e611e6f794fa77144528480778282e
jfinal 先前的处理方式用了很多年了,是没有问题的