2012-04-18 103 views
3

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

如果有人试图这样或类似的东西,请你给我讲了以下问题?:

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

在此先感谢!

+0

也许将您的问题分成多个问题。关于如何进行Web服务和如何执行持久数据的解决方案有一点相关,但当被置于一个答案时可能会引起混淆。 – 2012-04-18 11:53:19

+0

嗨@CookieMonster!,不知道是否将它拆分是一个好主意。两个问题共享相同的上下文并且可能解决一个问题(例如,来自web应用程序的对prolog引擎的管理)影响对另一个问题的正确解决方案(例如,prolog引擎如何与数据库保持同步)。试图给出问题的全貌。 – Sergio 2012-04-18 13:03:11

回答

1

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

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

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

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

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

否则,您需要实施一些智能缓存。我目前正在一个解决方案中使用一种入住/退房模式。但是这不适用于您有多个用户的Web服务器。我正在使用这种模式作为一个独立的解决方案,其中有一个用户和一个检出内存中的数据垃圾。对于具有不同多用户的Web服务器,Junks可能会溢出Web服务器内存。

所以缓存只适用于你可以限制和限制帆船或者如果你有一个非常大的网络服务器内存。也许你可以为你的应用程序找到这样一个不变量。否则,结论可能是你不能使用Java EE,而不管你是否使用Prolog。

相关问题