繁体   English   中英

在Java EE Web应用程序中使用JPL(Java + Prolog)

[英]Using JPL (Java + Prolog) in a Java EE web application

我想开发一个Java EE Web应用程序,该应用程序需要通过JPL的Prolog来完成某些与搜索有关的任务。 该Web应用程序将部署在JBoss应用程序服务器中。 Prolog引擎可以是YAP或SWI(afaik是目前唯一与JPL兼容的Prolog引擎)。 Prolog查询取决于存储在(可能很大)数据库中的信息。

如果有人尝试过此方法或类似方法,能否请您对以下问题给我反馈?:

  • 管理需要访问Prolog引擎的并发http会话的最佳方法是什么? 是否有可能-希望为每个单独的会话分配自己的Prolog引擎? 如果该解决方案有效,是否有可能实现类似于“ Prolog引擎池”的功能以快速将Prolog引擎分配给新会话? 还是最好的解决方案是拥有单个Prolog引擎,该引擎将同步管理所有查询请求? (然后慢慢地)。
  • 如何管理Prolog与数据库的交互? 如果数据库中的数据经常更改,并且Prolog需要此数据来解决其查询,那么使Prolog引擎中的事实与数据库中的数据保持同步的最佳策略是什么? 如果数据库变大,那么在每个新会话中从头开始的明智选择(例如,从Prolog事实中重新加载数据库中的所有数据)似乎不是一个好主意。
  • 在实现过程中是否还有其他与java-prolog-database交互相关的预期问题/难处?

提前致谢!

管理需要访问Prolog引擎的并发http会话的最佳方法是什么?

如果我看一下JPL的源代码,看起来它使用了一个引擎池。 查询数据类型实现枚举器模式以及close()操作。 我猜只要引擎处于活动状态,它就会自动分配给查询。

因此,每个http请求都可以通过新的查询对象独立访问Prolog系统。 如果您不想在http请求期间关闭查询对象,我想您也可以将其附加到http会话。 并重用另一个请求。

如何管理Prolog与数据库的交互?

这取决于数据库中数据的使用模式和可用的访问路径。 可能是您可以在请求期间快速访问大型数据库,并在每个请求期间重新获取数据。 例如,如果所需的匹配数据集很小,并且数据库具有良好的索引,则可以快速访问匹配的数据。

否则,您将需要实现一些智能缓存。 我目前正在使用一种签入/签出模式的解决方案。 但这不适合您有多个用户的Web服务器。 我将此模式用于一个独立的解决方案,其中有一个用户和一个签出的内存中的数据垃圾。 对于具有多个用户的Web服务器,垃圾邮件可能会使Web服务器的内存溢出。

因此,只有在您可以限制和限制垃圾邮件或Web服务器内存很大的情况下,缓存才起作用。 也许您可以为您的应用找到这样的不变式。 否则的结论可能是,无论是否使用Prolog,您都不能独立于Java EE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM