Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle在另一台计算机上调用Java方法_Java_Oracle_Plsql_Interop_Java Stored Procedures - Fatal编程技术网

Oracle在另一台计算机上调用Java方法

Oracle在另一台计算机上调用Java方法,java,oracle,plsql,interop,java-stored-procedures,Java,Oracle,Plsql,Interop,Java Stored Procedures,根据架构师的请求,我不允许将java类编译到我们正在运行的Oracle实例中,因此我正在寻找替代方案。需求是利用位于网络上的应用服务器上的java库。是否可以从PL/SQL调用另一台机器上的java方法?我发现在Oracle中谈论外部过程,但我不确定它是否允许这样做。另一方面,性能也必须足够快,才能用于成批处理数千或数百万个调用。我想最好的办法是将条目添加到另一个表中,您的Java进程将轮询该表以获取每一个或每一批消息。Oracle并不是专门为消息处理而设计的 在任何情况下,我都会与您的建筑师讨

根据架构师的请求,我不允许将java类编译到我们正在运行的Oracle实例中,因此我正在寻找替代方案。需求是利用位于网络上的应用服务器上的java库。是否可以从PL/SQL调用另一台机器上的java方法?我发现在Oracle中谈论外部过程,但我不确定它是否允许这样做。另一方面,性能也必须足够快,才能用于成批处理数千或数百万个调用。

我想最好的办法是将条目添加到另一个表中,您的Java进程将轮询该表以获取每一个或每一批消息。Oracle并不是专门为消息处理而设计的

在任何情况下,我都会与您的建筑师讨论该怎么做,因为他是专家


如果您的Oracle系统无法完成此任务,您可能需要一个不使用Oracle的解决方案。

您有三个选择:

1.)我们通过使用UTL_HTTP进行PL/SQL调用HTTP,然后让应用服务器调用java过程,解决了类似的问题。我们这样做是为了将Oracle数据库与Oracle报表连接起来。PL/SQL触发了一个HTTP请求,该请求由名为Java的应用服务器接收。Java可以通过普通的JDBC回调PL/SQL

2.)您可能无法加载该java进程,但您可以创建一些其他java存储过程,使用RMI调用它

3.)AQ是另一种方法。基本上,您可以使用AQ对消息进行排队,并在应用程序服务器上使用JMS将其出列并使用它


选项3将是最快的,尽管我们已经尝试了选项1,但它的延迟可能没有您想象的那么大。它还提供了一种通过并行运行多个请求来进行并行处理的方法。

谢谢。我们目前正在讨论这个问题,有一个类似于您的方案,但是逐步安排而不是轮询。我很好奇,为什么你排除了外部程序方法?@Alex主要是因为我上次使用它(十年多前)时速度非常慢。现在可能更好了。现在看起来确实更好了,但您仍然存在一个问题,即您的通信需要足够快,因此使用您的库作为外部过程并不更好。我希望有某种方法可以缓存外部过程,以便在第一次调用后在本地运行,或者从远程位置加载到本地运行,但我想这是不可能的。感谢您的见解。您可以缓存它所做的一些工作,但是它总是会有一些开销,除非您调用异步方法,否则它将比调用库作为外部过程花费更长的时间。