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()函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值