博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 动态更新 C 语言函数
阅读量:6712 次
发布时间:2019-06-25

本文共 608 字,大约阅读时间需要 2 分钟。

PostgreSQL 对于 C 语言编写的函数(包括其他与 C 语言兼容的语言,如 C++、Rust 等),是动态装载的,用 CREATE FUNCTION 创建完函数后,并不会立即装载,而是有连接建立之后,客户端第一次调用时才会进行装载,而且是装入到会话进程的内存里面去了。这时候,就算我们把 .so 文件删除,如果会话之前已调过一次函数的话,客户端还是可以继续调用函数的。

如果我们改写了函数代码,重新生成了 .so 文件,把新的 .so 文件覆盖老版本的 .so 文件,这时候在已有的会话里调用函数的话,有时候会报函数版本错误“ERROR unrecognized function API version, sql status: XX000”;有时候更严重,会导致当前会话的进程 Segment Fault,导致整个 PostgreSQL 崩溃而重启。这时候就算用 CREATE OR REPLACE FUNCTION 来重新装载函数也不行,也会导致 PostgreSQL 重启。

唯一可行的解决方案就是把 .so 文件版本化,每个编译出来的 .so 文件加上版本号,每个版本的文件都不同,把新版本的文件拷到 PKGLIBDIR 下,再用 CREATE OR REPLACE FUNCTION 替换掉老版本的函数,这样就算在已建立的会话里调用时,也是调的新版本的函数了。老版本的 .so 文件也可以删除了。

转载地址:http://lzolo.baihongyu.com/

你可能感兴趣的文章
《CMYK 2.0——设计师色彩管理手册》—第1章1.3节副作用
查看>>
java.util.concurrent.locks.LockSupport
查看>>
红帽加入 Node.js 基金会白金会员
查看>>
《OpenGL编程指南》一2.7 独立的着色器对象
查看>>
Ionic 3.4.2 发布,漂亮的 HTML5 移动应用框架
查看>>
Linux Kernel 4.9-rc8,4.9 分支最后一个候选版
查看>>
想开发 Android 分支?没门!
查看>>
《Web异步与实时交互——iframe AJAX WebSocket开发实战》—— 2.2 相关关键技术及工作原理...
查看>>
《Nmap渗透测试指南》—第1章1.5节Mac OS安
查看>>
重磅,企业实施大数据的路径
查看>>
linux之cp/scp命令+scp命令详解
查看>>
Spark 源码分析 -- BlockStore
查看>>
《C语言编程初学者指南》一1.7 创建并运行第一个C程序
查看>>
学习和使用 PHP 应该注意的10件事
查看>>
《当用户体验设计遇上敏捷》一3.3 设计的适合之处
查看>>
《众妙之门——网页设计专业之道》——1.4 如何与众不同
查看>>
多核编程入门
查看>>
《TensorFlow技术解析与实战》——1.6 机器学习的相关赛事
查看>>
大数据小说 | 如何用一小时看透一个初识的姑娘
查看>>
《Python面向对象编程指南》——1.10 一些其他的类定义
查看>>