gbase8s数据库+mybatis问题记录
在实际使用中一般都是mybatis+数据库连接池组合使用,单独使用mybatis 连接数据库时,在循环使用PreparedStatement 时 会发生内存泄漏,PreparedStatement资源得不到释放
测试代码片段如下
drawMapper = sqlsession.getMapper(DrawMapper.class);for(int i=0;i<10000;i++) {System.out.println("i= " + i);drawMapper.mergeInto(list);sqlsession.commit();}
sqlsession.close();
函数调用如下
drawMapper.mergeInto(list)
mapperMethod.execute(sqlSession, args)
sqlSession.update
executor.update(ms, wrapCollection(parameter))
delegate.update(ms, parameterObject)
doUpdate(ms, parameter)
closeStatement(stmt)
statement.isClosed()
最后判断statement.isClosed()时,会直接调用jdbc底层的isClosed()函数,查看文档发现,该函数为jdk1.6引入,当时gbase jdbc并未实现该函数,导致判断异常,从而无法释放statement对象资源,在大量的循环中易发生内存泄漏
在使用三方的数据库连接池 如 druid,c3p0等,连接管理由连接池本身维护,不需要调用jdbc中isClosed()函数