0

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

我观察了获取示例 PL/Java 代码以在数据库上安装和运行的过程,因为它首先.jar通过文件传输将编译的文件从应用程序服务器移动到数据库服务器,然后调用sqlj.install_jar('file::<path>', 'name', true);将其加载.jar到数据库服务器中。

我正在寻找一种不同的方式来加载已编译的 PL/Java 代码,而无需使用上述文件传输方法。我正在查看 PL/Java 文档,它提到该sqlj.install_jar功能还支持.jar从网络中提取。从理论上讲,我可以让应用程序服务器短暂地启动一个 HTTP 文件服务器来提供.jar文件并调用以从 ad-hoc 网络服务器sqlj.install_jar中提取文件。.jar但是,如果应用程序服务器的主机名未知(即不是本地主机或防火墙/专用网络之后),这可能会很困难。

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

PL/Java 中是否已经存在类似的东西?

4

2 回答 2

1

如果你这样做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

带 aurlstring的那个是 SQL/JRT 标准指定的那个。采用 a 的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)将其内容作为 a 返回bytea,因此您可以将其传递byteainstall_jar. 完成后,您只需使用\lo_unlink从服务器中删除大对象。

如果您使用 JDBC 或其他一些编程 API 连接到服务器,您只需将本地 jar 文件绑定为select sqlj.install_jar(?::bytea,?,?);.

于 2020-03-04T04:52:45.240 回答
0

不幸的是,“否”是简短的回答。此 PL/Java 未使用控制文件和将其部署为扩展所需的 .sql 文件进行格式化或编写。尽管我在他们的官方网站上读到的任何内容 都说这是 PG 的扩展。

但是要以 PG(postgres) 方式安装扩展,您需要拥有它的控制文件,并且因为它是用 java 编写的,并且没有任何必须以自己的方式编译的控制文件。

通常 PGXS 是在 PG_CONFIG 文件的帮助下帮助编译 postgres 扩展的东西。

注意:在他们的网站上明确提到“可以下载 PL/Java,然后使用 Maven 构建”

只是想分享一点我所知道的:),希望它有所帮助。

于 2020-02-06T05:54:02.913 回答