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

openGauss JDBC两个新参数的案例

原创 多米爸比 2023-02-09
2319

openGauss JDBC基于jdk1.8开发,基本功能与PostgreSQL JDBC类似,我们下载的压缩包里通常包含两个jar包文件。

  • openGauss-jdbc-x.y.z.jar
  • postgresql.jar

这两个jar包都可以使用,只是命名空间有差异,功能是一样的。从长远角度考虑,推荐使用第一个,它的包名是org.opengauss开头,可以在同一个java虚拟机里连接PG和openGauss。

openGauss JDBC也增加了一些新功能特性,比如下面的两个参数:

  • batchMode:可用于批量插入场景下提升性能。
  • blobMode:用于设置setBinaryStream方法为不同的数据类型赋值,on表示为blob类型数据赋值,off表示为bytea类型数据赋值。

上面两个参数默认都是打开状态,有些场景下如果我们使用不当会出现一些问题,本文将分享具体的案例。

batchMode与hibernate级联更新

在java里使用数据库持久化映射框架hibernate做对象的级联更新时,需要关闭批量更新模式参数。

下面的java代码更新一个流程事件(Incident对象)时,会同时更新两个操作人(Person对象)

image.png

如果不设置batchMode为off,则会出现下面的报错:

image.png

在连接参数里关闭batchMode即可解决问题。

jdbc:postgresql://[ip:port]/dbname?batchMode=off

另外一个是评论区提供的案例,当使用批量插入接口,仅仅只插入一条数据同时自动获取自增主键的值时出现如下错误,也需要关闭。

java.lang.IllegalStateException: Received resultset tuples, but no field structure for them

完整的测试截图如下:

image.png

blobMode与空数据

直接看下面这段代码片段:

String data = "";
byte[] dataBytes = data.getBytes();
InputStream input = new ByteArrayInputStream(dataBytes,0,dataBytes.length);
PreparedStatement ps = conn.prepareStatement("update t set info = ? ");
ps.setBinaryStream(1, input, dataBytes.length);

此时执行到最后一行会出现如下报错:

org.postgresql.util.PSQLException: 无效的串流长度 

setBinaryStream方法的输入流参数并不是null对象,但第三个长度参数值为0,JDBC进入到blobMode模式分支,此时传递的参数会引起错误,关闭blobMode,不使用blob类型赋值而是bytea类型赋值则正常。

正确的连接参数设置如下:

jdbc:postgresql://[ip:port]/dbname?blobMode=off

完整的测试代码截图如下:
image.png

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

评论