暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MyBatis生成值获取异常导致Closing ResultSet 的原因与处理办法

原创 科蓝SUNDB编辑部 2022-11-11
1974

1. 环境

操作系统版本及内核发行版本 :
CentOS 7.6

数据库版本及架构 :
数据库架构单机, 数据库版本为Release 22c

开发语言及使用框架 :
JAVA-MyBatis

2. 问题描述

MyBatis获取生成的主键值失败,报出Closed ResultSet异常。

错误代码 :

Cause:org.apache.ibatis.executor.ExecutorException:Error getting generated key or setting result to parameter object 。Cause:java.sql.SQLException:The ResultSet is already closed。
image.png

3. 原因

SUNDB获取resultset中的主键值的方法有两种getGenerateKeys方法和selectKey方法。mybatis默认是开启使用getGenerateKeys方法的。当主键并不是数据库生成的时候,SUNDB无法使用getGenerateKeys方法获取到生成的值,此时会发生statement关闭,导致结果集关闭,抛出结果集已关闭的异常。

image.png

4. 解决方案

在有应用生成主键以及数据库生成主键同时存在的情况下,最好关闭getGenerateKeys: 关闭getGenerateKeys 方法之后,对于数据库自动生成的自增主键,需要使用通用的<selectKey *** > select last_identity_value() from dual; 来获取自增值(这里需要注意的是:自增主键必须是数据库生成的,如果是写入的主键值,则会返回空或者之前获取到的值,从而关闭结果集或者获取到错误的值。)。
image.png
image.png

最后修改时间:2023-07-17 14:52:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论