0

私のサービスは、リクエストごとに(txtファイルから)大量のデータをメモリにロードします。でも、データはメモリに残しておきたい。同じtxtファイルから読み取られるためです。

public class pirTMain {
  public String[] RUN_pirT(...){
  ...
  //this object will read txt files to initialize
  ELC elc = new ELC(elcFolder.getPath()); 

  //use elc to initialize a graph
  pirT.initGraph(userID, nodeFile.getPath(), userScore, elc, true, begin, target); 

  //Use graph to search paths
  itinerary = pirT.search(userID, TopK, begin, beginWithTime, target, targetWithTime); 
  ...

Axis2 のドキュメントを読みました。サービス範囲を「アプリケーション」に変更できると書かれています。しかし、Eclipse プラグインを使用して Web サービス *.arr を生成しているため、その方法はまだわかりません。elc オブジェクトを別のサービスに分離する方法を教えてもらえますか? 次に、私の pirTMain クラスがそれを使用できます。

pirTMain は「リクエスト」です。

elc は「アプリケーション」です。

どうもありがとう。

4

1 に答える 1

0

これを実現するにはさまざまな方法がありますが、私の頭に浮かぶ最も簡単な方法は、同じ仮想マシン内のすべてのスレッド間で共有されるように、読み取り行への静的参照を作成することです。

@WebService
public MyServiceClass {
    private static String[] readLines = null;

    private static synchronized getLines(){
         if (readLines == null)
             readLines = ....;

         return readLines;
    }

    public int getNumberOfLines(){
         return MyServiceClass.getLines().length;
    }

    public String getLine(int position){
         return MyServiceClass.getLines()[position];
    }
    ...

}

おそらく「最もクリーンな」方法ではありませんが、機能し、簡単に実行できます。必要に応じて、より標準的な「シングルトン パターン」でログインをラップすることもできます。getLines はスレッド セーフになるように同期する必要がありますが、ボトルネックが発生した場合に synchronized キーワードを削除すると、最初の呼び出しで無駄な読み取りが発生する可能性がありますが、高速になることに注意してください。

于 2013-09-10T16:55:48.120 に答える