批量操作后执行prepareStatement关闭实际上服务端并没有关闭

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】jdbc驱动版本2.4.3,ob版本5.7.25-OceanBase_CE-v4.2.1.0
【问题描述】使用oceanbase的jdbc驱动执行批量操作后关闭prepareStatement,实际上服务端并没有关闭,当创建的prepareStatement总数(包含使用jdbc执行过关闭操作的)超过数据库系统参数open_cursors配置的数量时,会出现 maximum open cursors exceeded 报错,这是否OB的bug,如何解决?
【复现路径】由于jdbc连接参数useCursorFetch=true(这个参数应用必须),驱动会设置useServerPrepStmts=true,cachePrepStmts参数则为默认值false,例如open_cursors配置为1000,每次执行批量操作都创建一个prepareStatement,完成批量操作后手动关闭,在创建完第1000个prepareStatement后执行commit操作就会报错
【附件及日志】
jdbc连接参数


批量操作代码


数据库open_cursors参数

报错堆栈

你好 你用的ob是哪个版本的 还有就是jdbc驱动是哪个版本的

jdbc驱动版本2.4.3,ob版本5.7.25-OceanBase_CE-v4.2.1.0
image
image

尽量开大一点 open_cursors还包含打开的 PS(prepare statement)个数
你可以根据租户id查询一下
select * from gv$sesstat where CON_ID=‘1003’ and STATISTIC# =‘113’ and value >0;

你这个是oracle模式才有的参数 应该是商业版的吧

但是实际应用里用的是连接池,常用的连接不会关闭,只要某个连接出现这个报错了,不是已经无法新建prepareStatement,后面不是都执行不了sql了吗

是社区版的mysql模式,公司没有购买商业版

jdbc2.4.3存在这个问题 你用2.4.11这个版本 这个版本已经修复了

2 个赞

如果直接用mysql的jdbc会不会有这个问题

这个是没有的