卢卡·费拉里:使用PL/Java:需要澄清的问题
内容提要
这篇文章讨论了使用PL/Java时的一些问题和解决方法。作者在之前的文章中提到了编辑java.policy文件来解决Java权限问题,但是这样会改变所有Java代码的策略规则。文章中提到了PL/Java使用自定义的策略文件,可以在PostgreSQL配置目录中找到。此外,还介绍了PL/Java的默认安装位置和编译Java代码所需的API jar文件。最后,作者纠正了之前关于数据往返和PL/Java通信方式的错误理解。总的来说,PL/Java是一个成熟的项目,解决了许多与Java代码集成的问题。
延伸解读
权限配置:避免全局修改 java.policy
文章指出,直接编辑 java.policy 文件会改变所有 Java 代码的策略规则,而不仅仅是 PL/Java。PL/Java 自 1.6 版本起使用自定义策略文件 pljava.policy,位于 PostgreSQL 配置目录中。该文件定义了 Sandboxed 和 Unsandboxed 两个主体,分别对应不同权限。通过配置此文件,可以细粒度地管理 PL/Java 代码的权限,避免影响系统其他 Java 应用。
JVM 位置与 API jar 的获取
PL/Java 的 pljava.libjvm_location 变量用于指定 JVM 位置。如果安装的包已预配置默认 JVM 路径(如 Ubuntu 包),则无需手动设置;否则需检查配置。编译 Java 代码所需的 pljava-api jar 通常随 PGDG 发行版安装在 PostgreSQL 共享目录中,无需从源码编译。使用 Maven 时,可将该 jar 安装到本地仓库以便依赖。
数据通信:并非进程间往返
作者纠正了之前关于数据往返的错误理解。PL/Java 通过 JNI 与 PostgreSQL 后端进程通信,通信发生在同一进程内,因此不涉及不同进程间的往返。然而,仍需在 Java 类型和 PostgreSQL 类型之间转换复杂数据结构,作者曾误用“往返”一词描述此过程。这澄清了 PL/Java 的性能特性。
PL/Java 的成熟性与问题解决
文章总结认为 PL/Java 是一个成熟的项目,许多常见问题已有直接解决方案。作者最初遇到的困难大多源于误解,而非项目缺陷。通过正确配置策略文件、利用预置的 API jar 以及理解 JNI 通信机制,可以更顺利地集成 Java 代码。这体现了 PL/Java 在 PostgreSQL 中运行 Java 的可靠性和维护者的积极支持。
Q&A
PL/Java的自定义策略文件在哪里可以找到?
PL/Java的自定义策略文件可以在PostgreSQL配置目录中找到。
编辑java.policy文件会有什么影响?
编辑java.policy文件会改变所有Java代码的策略规则,而不仅仅是PL/Java的规则。
如何编译Java代码以与PL/Java一起使用?
可以使用已经安装在PostgreSQL共享文件夹中的API jar文件,或者将其安装到Maven本地仓库中。
PL/Java是如何与PostgreSQL进行通信的?
PL/Java通过JNI与PostgreSQL后端进程通信,不涉及不同进程的往返。
PL/Java的默认安装位置是什么?
PL/Java的默认安装位置通常在/usr/share/postgresql/16/pljava/目录下。
PL/Java项目的成熟度如何?
PL/Java是一个成熟的项目,解决了许多与Java代码集成的问题。