gpt4 book ai didi

java - 如何将编译后的 PL/Java 代码从应用程序直接部署到 Postgres 数据库?

转载 作者:行者123 更新时间:2023-12-02 09:02:04 25 4
gpt4 key购买 nike

我已经设置了一个 Postgres 数据库服务器 PL/Java安装了二进制文件。

我观察了在数据库上安装和运行示例 PL/Java 代码的过程,因为它从移动已编译的 .jar 开始。将文件从应用服务器通过文件传输的方式发送到数据库服务器,然后调用sqlj.install_jar('file::<path>', 'name', true);加载.jar进入数据库服务器。

我正在寻找一种不同的方式来加载已编译的 PL/Java 代码,而不需要采用上面解释的文件传输方法。我正在查看 PL/Java 文档,它提到 sqlj.install_jar函数还支持拉.jar来自网络。理论上,我可以让应用程序服务器短暂启动 HTTP 文件服务器来为 .jar 提供服务。文件并调用sqlj.install_jar.jar来自临时网络服务器。但是,如果应用程序服务器的主机名未知(即不是本地主机或位于防火墙/专用网络后面),这可能会很困难。

但是我想知道是否有更好的方法来做到这一点。我正在寻找一种允许应用程序服务器直接将实现推送到 .jar 内部的方法使用与 Postgres 服务器的现有连接,而不诉诸上面解释的“黑客”。

PL/Java 中已经存在这样的东西吗?

最佳答案

如果您在 psql 中执行此操作:

\df sqlj.install_jar

您将看到该函数有两个版本:

 Schema |    Name     | Result data type |                          Argument data types                           | Type 
--------+-------------+------------------+------------------------------------------------------------------------+------
sqlj | install_jar | void | image bytea, jarname character varying, deploy boolean | func
sqlj | install_jar | void | urlstring character varying, jarname character varying, deploy boolean | func

采用 urlstring 的字符串是 SQL/JRT 标准指定的字符串。采用 bytea 的扩展是 PL/Java 非标准扩展,但它对于本例很有用。如果 jar 文件在您运行 psql 的客户端计算机上可用,您可以执行以下操作:

postgres=$ \lo_import foo.jar
lo_import 16725
postgres=$ select sqlj.install_jar(lo_get(16725), 'foo', true);
install_jar
-------------

(1 row)
postgres=$ \lo_unlink 16725
lo_unlink 16725

也就是说,您可以使用psql\lo_import命令,该命令打开一个本地文件并将其另存为“大对象” 在服务器上,并为您提供一个 Oid 编号来引用它(我的示例中的 16725 对您来说可能是不同的编号)。

一旦大对象存在,SQL 函数 lo_get(16725) 将其内容作为 bytea 返回,因此您可以将其传递给 bytea install_jar 的风格。完成后,您只需使用 \lo_unlink 从服务器中删除大对象。

如果您使用 JDBC 或其他编程 API 连接到服务器,则只需将本地 jar 文件绑定(bind)为 select sqlj.install_jar(?::bytea,?,?);< 中的第一个参数即可.

关于java - 如何将编译后的 PL/Java 代码从应用程序直接部署到 Postgres 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60088220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com