3

特定の検索関連タスクのために、JPL を介して Prolog を必要とする Java EE Web アプリケーションを開発したいと考えています。Web アプリケーションは JBoss アプリケーション サーバーにデプロイされます。Prolog エンジンは、YAP または SWI のいずれかです (現時点で JPL と互換性のある唯一の Prolog エンジンです)。Prolog クエリは、(潜在的に大規模な) データベースに格納されている情報に依存します。

誰かがこれまたは似たようなことを試した場合、次の質問についてフィードバックをいただけますか?:

  • Prolog エンジンへのアクセスを必要とする同時 http セッションを管理する最良の方法は何ですか? 個別のセッションごとに独自の Prolog エンジンを割り当てることは可能ですか? このソリューションが機能する場合、「プロローグ エンジン プーリング」に似たものを実装して、プロローグ エンジンを新しいセッションにすばやく割り当てることは可能ですか? . または、すべてのクエリ要求を同期的に管理する単一の Prolog エンジンを用意するのが最善の解決策でしょうか? (そしてゆっくり)。
  • Prolog とデータベースの相互作用をどのように管理できますか? データベース内のデータが頻繁に変更され、Prolog がクエリを解決するためにこのデータを必要とする場合、Prolog エンジン内のファクトをデータベース内のデータと同期させるための最良の戦略は何ですか? データベースが大きくなると、新しいセッションごとにゼロから開始するという便利なオプション (たとえば、データベースからすべてのデータを Prolog ファクトとして再ロードする) は良い考えではないようです。
  • 実装中に java-prolog-database の相互作用に関連して予想されるその他の問題/問題はありますか?

前もって感謝します!

4

1 に答える 1

2

Prologエンジンへのアクセスを必要とする同時httpセッションを管理するための最良の方法は何ですか?

JPLのソースを見ると、エンジンプールを使用しているように見えます。クエリデータ型は、列挙子パターンとclose()操作を実装します。エンジンがアクティブである限り、エンジンは自動的にクエリに割り当てられると思います。

したがって、各httpリクエストは、新しいクエリオブジェクトを介してPrologシステムに個別にアクセスできます。httpリクエスト中にクエリオブジェクトを閉じたくない場合は、httpセッションにアタッチすることもできると思います。そして、それを別のリクエストで再利用します。

Prologとデータベースの相互作用をどのように管理できますか?

これは、データベース内のデータの使用パターンと使用可能なアクセスパスによって異なります。リクエスト中に非常に大規模なデータベースにすばやくアクセスし、各リクエスト中にデータを再フェッチできる可能性があります。たとえば、必要な一致データセットが小さく、データベースに適切なインデックスがある場合、一致データにすばやくアクセスできます。

それ以外の場合は、インテリジェントなキャッシュを実装する必要があります。私は現在、一種のチェックイン/チェックアウトパターンを使用するソリューションに取り組んでいます。ただし、これは、複数のユーザーがいるWebサーバーには適していません。このパターンは、メモリ内に1人のユーザーと1人のチェックアウトされたデータジャンクが存在するスタンドアロンソリューションに使用しています。複数のユーザーが変化するWebサーバーの場合、ジャンクはWebサーバーのメモリをオーバーフローさせる可能性があります。

したがって、キャッシュは、ジャンクを制限および調整できる場合、またはWebサーバーのメモリが非常に大きい場合にのみ機能します。たぶん、あなたはあなたのアプリケーションのためにそのような不変条件を見つけることができます。そうでなければ、結論は、Prologを使用するかどうかに関係なくJavaEEに移行できないということになる可能性があります。

于 2012-09-30T18:41:54.563 に答える