3

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

如果有人尝试过这个或类似的东西,您能否就以下问题给我反馈?:

  • 管理需要访问 Prolog 引擎的并发 http 会话的最佳方法是什么?是否有可能 - 可取? - 为每个单独的会话分配其自己的 Prolog 引擎?如果这个解决方案有效,是否可以实现类似于“Prolog 引擎池”的东西来快速将 Prolog 引擎分配给新会话?. 或者最好的解决方案是拥有一个同步管理所有查询请求的 Prolog 引擎?(慢慢地)。
  • 如何管理 Prolog 与数据库的交互?如果数据库中的数据经常变化,Prolog 需要这些数据来解决它的查询,那么让 Prolog 引擎中的事实与数据库中的数据保持同步的最佳策略是什么?如果数据库变大,在每个新会话中从头开始的海军选项(例如,将数据库中的所有数据作为 Prolog 事实重新加载)似乎不是一个好主意。
  • 在实施期间与 java-prolog-database 交互相关的任何其他预期问题/困难?

提前致谢!

4

1 回答 1

2

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

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

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

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

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

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

所以缓存只有在你可以限制和限制垃圾或者你有一个非常大的网络服务器内存时才有效。也许您可以为您的应用程序找到这样的不变量。否则,结论可能是你不能独立于你是否使用 Prolog 去 Java EE。

于 2012-09-30T18:41:54.563 回答