50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

PostgreSQL 14 会破坏其官方的.NET 和 Java 驱动

  • 2022-07-06
  • 本文字数:1037 字

    阅读完需:约 3 分钟

PostgreSQL 14会破坏其官方的.NET和Java驱动

PostgreSQL 14 中的新语法,尤其是使用BEGIN ATOMIC ... END创建 SQL 函数,在某些情况下会破坏其官方的.NET 和 Java 数据库驱动。但只要不通过NpgsqlPgJDBC修改数据库模式,就不会出现问题。


对于 Java 的 JDBC 和.NET 的 ADO.NET 数据库驱动框架,它们存在一个共同点,那就是都支持使用分号实现 SQL 语句批处理。批处理对提高性能是十分必要的。如果客户端一次只发送一个命令,那么每个命令就必须要付出通信延迟代价。但如果使用批处理一次执行一批语句,那么只需付出一次通信代价。


事实上,SQL Server 等数据库将批处理语句作为一个庞大的 SQL 字符串整体发送。但 PostgreSQL 的 wire 通信协议工作机制有别如此。虽然批处理语句依然整体发送,但客户端需将语句拆分为各条独立的命令。

原始实现可简单地假设每个分号标识一条语句的终止处。当然,分号也可能是一条语句字符串中的内容,而非一条语句的结尾。Npgsql 和 PgJDBC 解析器对此做了考虑。


这曾经工作得很好。但现在新建 SQL 函数体中可以定义多条语句,那么应如何处理?当然这也不是问题,因为函数体使用“$...$”标记做转义。在“$...$”标记对内的分号,与其它字符串文字的处理方式无异。


进而 PostgreSQL 14 添加了称为“SQL 标准语法”的“BEGIN ATOMIC ... END”语句。对此发行说明中给出如下解释。


使用 SQL 标准语法编写的函数或过程能快速解析,并存储为解析树形式。这可更好地追踪函数的依赖关系,并具有更好的安全性。


由于分号可能并非出现在引号引起的字符串中,而是会出现在BEGIN ATOMIC ... END语句块内的任何位置,如果解析器使用当前的方法,就无法确定批处理中语句的拆分位置。完全支持语句拆分或是要去更改 API,或是要去新建一个更复杂的解析器。


Npgsql 已关注当前解析器的开销问题,决定更改 API。在 Npgsql 的库中增加了一种称为“原始SQL(raw SQL mode)”的模式。此模式没有使用命名参数,需要使用位置(positional)参数。


而 PgJDBC 团队尚未决定采用何种方法。其进展可关注软件缺陷报告“新的PG14 SQL标准函数破坏了PgJDBC解析器(New PG14 SQL-standard function bodies break our SQL parser)”。


作者简介:

Jonathan Allen 在上世纪 90 年代后期为一家健康诊所实施 MIS 项目,实现从 Access 和 Excel 逐步升级为企业解决方案。在金融部门编写五年自动交易系统后,他成为多个项目的顾问,其中包括机器人仓库 UI、癌症研究软件中间层,以及解决一家大型房地产保险公司的大数据需求。在空闲时间,他喜欢研习 16 世纪的武术。


原文链接:

PostgreSQL 14 Breaks the .NET and Java Drivers for PostgreSQL

2022-07-06 16:1614849

评论

发布
暂无评论
发现更多内容

Vue 3 组件开发:搭建基于SpreadJS的表格编辑系统(功能拓展)

葡萄城技术团队

探索压测奥妙

ninetyhe

微服务 分布式系统 压力测试 性能调试

一周信创舆情观察(2020.12.28~2021.1.3)

统小信uos

可用性、可维护性、可靠性有什么区别?

禅道项目管理

DevOps 可用性 质量保障 可靠性

抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题

楼下小黑哥

支付系统 架构设计

低成本构建音视频质量监控平台的最佳路径

华为云开发者联盟

数据中台 数据湖 云原生 RTC 华为云

应用案例| 基于Volcano 的锐天大规模离线高性能计算生产实践

华为云原生团队

云计算 大数据 AI 云原生 批量计算

架构师训练营第十三周

我是谁

架构师训练营第 1 期

Spring 事务,你真的用对了吗(下篇)?

废材姑娘

Java Spring Framework

<译文>NGINX 实战手册 - 控制访问

东风微鸣

CSS04 - 常用外观属性

Mr.Cactus

html/css

IoT爆发前夕,企业架构要面对哪些变革?

京东科技开发者

物联网

技术干货丨隐私保护下的迁移算法

华为云开发者联盟

迁移

企业架构培训感悟

Man

企业架构 中台战略

云算力系统APP开发|云算力软件开发

系统开发

在NGINX中根据用户真实IP限制访问

东风微鸣

微服务可能失败的11个原因

xcbeyond

微服务 方法论

在线自习室场景爆发,在线教育平台用户时间争夺战打响

ZEGO即构

比易宝betBEB平台获278万美元约合1807万元融资

DT极客

Ansible 新手指南 - 如何批量管理 NGINX

东风微鸣

ansible

Kubernetes 疑难问题排查 - 10s 延迟

东风微鸣

Kubernetes

Java内存模型精讲

伯阳

Java 后端 多线程 多线程与高并发 Java内存模型

大作业一

Geek_83908e

架构师一期

低代码和零代码快速开发崛起,迎来普通人开发软件的时代!

J2PaaS低代码平台

uni-app实现实时消息SDK插件

anyRTC开发者

uni-app 音视频 WebRTC 跨平台 sdk

ROMA Compose:ROMA的新武器

华为云开发者联盟

数据 API ROMA

做运维,送你7个常用的服务器资源监控工具

华为云开发者联盟

工具 监控 内存 服务器 系统

架构师训练营-第二周作业

Mark

深入分析单例设计模式

Andy

一文教你学会Hive视图和索引

大数据老哥

大数据 hadoop hive

详解 Flink 容器化环境下的 OOM Killed

Apache Flink

flink 流计算

PostgreSQL 14会破坏其官方的.NET和Java驱动_数据库_Jonathan Allen_InfoQ精选文章