2012-04-18 106 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。

相關問題