PL/Java
PL/Java 是 Unvdb的 Java 语言扩展,允许你直接在数据库中用 Java 编写函数、触发器和过程。
基本安装与配置
1. Unvdb-TX 配置
确保 unvdbsvr.conf 配置如下(根据实际路径修改):
shared_preload_libraries = pljava
pljava.libjvm_location = '/usr/lib/jvm/java-11-openjdk/lib/server/libjvm.so'#改为实际java路径
2. 安装 PL/Java 扩展
扩展注册
CREATE EXTENSION pljava;
插件参数说明
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pljava.allow_unenforced |
list | 空列表 | 在 “无策略执行” 模式下,允许的语言名称(如 javau, java)。:contentReference[oaicite:3]{index=3} |
pljava.allow_unenforced_udt |
bool | off | 同上,但针对 UDT(用户自定义类型)的转换。:contentReference[oaicite:4]{index=4} |
pljava.debug |
bool | off | 启动调试模式,进入 JVM 前暂停,以便连接调试器。:contentReference[oaicite:5]{index=5} |
pljava.enable |
bool | on | 控制 PL/Java 初始化是否继续执行,可用于调试。:contentReference[oaicite:6]{index=6} |
pljava.implementors |
list | [postgresql] |
设置部署描述中认可的 implementor 名称(JAR 内)。:contentReference[oaicite:7]{index=7} |
pljava.java_thread_pg_entry |
enum | allow |
控制 Java 线程访问 PG 的策略:allow/error/block/throw。:contentReference[oaicite:8]{index=8} |
pljava.libjvm_location |
string | — | 指定 libjvm.so/dll/dylib 的绝对路径,用于加载 JVM。:contentReference[oaicite:9]{index=9} |
pljava.module_path |
string | 自动计算 | Java 模块路径,一般由两个 Jar 构成,必要时可自定义。:contentReference[oaicite:10]{index=10} |
pljava.policy_urls |
list | ["file:${org.postgresql.sysconfdir}/pljava.policy","="] |
Java 安全策略文件 URL 列表,用于安全模式执行。:contentReference[oaicite:11]{index=11} |
pljava.release_lingering_savepoints |
bool | off | 是否在函数返回时释放未处理的 savepoints。:contentReference[oaicite:12]{index=12} |
pljava.statement_cache_size |
int | 默认值未显式给出,通常是几十至几百 | JDBC 已准备语句的 MRU 缓存大小。:contentReference[oaicite:13]{index=13} |
pljava.vmoptions |
string | — | JVM 启动参数,如 -Xmx256m 或 --add-modules。:contentReference[oaicite:14]{index=14} |
示例
a. 写 Java 类:
demo/Hello.java
package demo;
public class Hello {
public static String greet(String name) {
return "Hello from Java, " + name + "!";
}
}
编译打包:
javac -d . Hello.java
jar cf hello.jar demo/Hello.class
b. 安装 jar 到数据库:
SELECT sqlj.install_jar('file:///your/absolute/path/hello.jar', 'hello_jar', true);
c. 注册函数:
CREATE FUNCTION hello_java(text)
RETURNS text
AS 'demo.Hello.greet'
LANGUAGE java;
d. 调用测试:
SELECT hello_java('unvdb'); -- 应输出 Hello from Java, unvdb!