写点什么

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:1615019

评论

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

GreptimeDB v0.1 发布|原生支持 Python, PromQL 和对象存储

Greptime 格睿科技

云原生 时序数据库 PromQL

Matlab实现图像分割

timerring

图像分割

Jasper狂飙:AIGC现象级应用的增长秘笈

OneFlow

人工智能 深度学习 ChatGPT

如何基于 Skywalking 来快速搭建一套应用性能监控平台

观纵科技

APM 全链路监控 Skywalking

Cloud Kernel SIG月度动态:发布 ANCK 新版本及 Plugsched v1.2.0

OpenAnolis小助手

内核 龙蜥社区 sig anck CVE修复

企业全球化出海技术体系建设实录【专题合集】

阿里技术

技术专题合集 全球化技术能力

精准医疗迎数字化新机遇,百奥利盟携手阿里云为创新生物药提速上市

云布道师

阿里云

如何从5万设备中找出频繁掉线设备,长期不在线的设备?——设备管理运维类

阿里云AIoT

15 英寸 MacBook Air 和黄色 iPhone 14 在路上吗?

Rose

apple

DAPP质押挖矿项目技术开发功能丨DeFI质押挖矿系统开发详细方案

I8O28578624

贴合运维业务场景的告警聚合实现——以Zabbix为例

观纵科技

zabbix 运维监控 IT运维

如何规避近年频发的数据安全事故?

Zilliz

云原生 云服务 数据安全

详解数仓中sequence的应用场景及优化

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

JavaScript 对象管家 Proxy

devpoint

JavaScript Proxy ECMAScript 6

IoT物联网时代,如何优化你的网络- DNS域名解析服务——设备接入类

阿里云AIoT

缓存 网络协议 物联网 域名解析 调度

React Hooks源码深度解析

京东科技开发者

函数 React Hooks 企业号 3 月 PK 榜

IoT物联网平台-规则引擎SQL数据格式详解——设备管理运维类

阿里云AIoT

sql 物联网 数据格式

Axure9和Axure10哪款好?有什么区别呢?

Rose

原型设计 Axure RP

【活动报名】数据存储降本增效应用实践 PolarDB × ScaleFlux 线下 Meetup 来袭!(杭州站)

阿里云数据库开源

数据库 postgresql 阿里云 开源 polarDB

还在curd吗?封装属于自己的Spring-Boot-Starter

Java spring Spring Boot Starter

高效学 C++|组合类的构造函数

TiAmo

组合 C++

mac office 365 商业专业版附升级工具

Rose

Office 365

ArchKeeper(开篇):架构守护平台的问题与理念

京东科技开发者

架构 敏捷 系统架构 腐化治理 企业号 3 月 PK 榜

Go 闯进 Top 10、C++ 再次被 Java 反超,TIOBE 3 月榜单发布

博文视点Broadview

小程序无需编程,体验IoT物联网平台-物模型开发——设备接入类

阿里云AIoT

物联网

共建区块链生态,旺链科技获颁2022年度FISCO BCOS产业应用合作伙伴

旺链科技

区块链 区块链+

天池 DeepRec CTR 模型性能优化大赛 - 夺冠技术分享

阿里云大数据AI技术

人工智能 深度学习

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