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

标签 java database jakarta-ee prolog jpl

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

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

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

提前致谢!

最佳答案

What is the best way to manage concurrent http sessions that need access to the Prolog engine?.

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

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

How could be managed the interaction of Prolog with the database ?

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

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

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

关于java - 在 Java EE Web 应用程序中使用 JPL (Java + Prolog),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10207511/

相关文章:

java - Android 向服务器发出请求

java - 从 Visual Studio 外部创建 JVM 崩溃

mysql - 通过 SSH 连接到 MySQL 错误 2013 (HY000)

java - 在 Eclipse (3.6 Helios) 中使用 Spring (3.0.5)

Java尾日志文件并在jsp中显示

java - context.xml 和 server.xml 之间的区别?

java - Android TextView 避免超出视野

java - Nifi JSON ETL : Custom Transformation Class not found with JoltTransformJSON Processor

java - SQLite 无法在 OnCreate 方法中创建数据库。 E/SQLiteLog : (1)

mysql - 从一系列年份中选择数字