更新:プレストンが指摘したように、次の問題はオブジェクトの直列化に関連している可能性があります。どのようにこれを最適化するための任意のアイデア?アプリケーションクライアント<-> EJBコールのラウンドトリップが遅いようです
私は現在、古いJavaEEアプリケーションでいくつかのことを修正しています。これは、EJBモジュールとアプリケーションクライアントモジュールを使用しています。 EJBはすべてのデータベースクエリを処理します。この例では、特定の年の "エンタープライズ"エンティティを返すメソッドgetEnterprises(int year)
を考えてみましょう。現在、それは約2500のエントリです。
注:「エンタープライズ」という単語は、説明の目的でのみ使用しています。 )
ここでは、エンタープライズエンティティには、code
とname
という2つのフィールドしかないとしましょう。リモート豆の内部メソッドは次のようになります。アプリケーションクライアントで
public List<Enterprise> getEnterprises(int year){
return em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
.setParameter("year", year)
.getResultList();
}
、このような行があります:
List<Enterprise> result = requestBean.getEnterprises(1996);
は、これは私には正しいようです。私にとって奇妙なことは、クライアントの呼び出しには約15秒かかります!だから私はいくつかのログを追加しました:クライアント上で、それはとりながら、結果のタイムスタンプから
public List<Enterprise> getEnterprises(int year){
logger.finest("Begin fetch on remote");
List<Enterprise> output = em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
.setParameter("year", year)
.getResultList();
logger.finest("End fetch on remote");
return output;
}
と...
logger.finest("Begin fetch on client");
List<Enterprise> result = requestBean.getEnterprises(1996);
logger.finest("End fetch on client");
を、私は、サーバー上のコールが1秒未満で完了したことに気づきました15秒以上。
例手書きトレース:
2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:00 | FINEST | Begin fetch on remote
2011-01-04 12:01 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client
だから私はこの問題は、クライアント/サーバ間の通信にあると推測しています。上記の例では、クライアント - >サーバ通信が遅いか、サーバ - >クライアント通信かをチェックしなかったことに注意してください。私が気づいたのは、サーバーログが "期待される"実行時間を示すのに対し、クライアントでは遅いということです。私はそのくらいに掘っていない
2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:07 | FINEST | Begin fetch on remote
2011-01-04 12:08 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client
:
2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:15 | FINEST | Begin fetch on remote
2011-01-04 12:16 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client
あるいは:他の言葉では、それは同様に、同様にこのようなものかもしれません。
私はJavaEEについて多くの経験をしていないので、私はジャングルで少し失われています。あまりにも多くの設定、コンポーネントがあり、どこから始めたらいいかわからないことがあります。それはサーバー設定ですか? Bean自体の問題?私が豆と呼ぶ方法は?私は知らない...
...ああ...それはグラスフィッシュで実行され、テストのために、localhost
で実行されます。だからネットワーク自体は問題ではありません...
お電話ください。準備が整ったらテストサーバーがあります。私はそこに展開し、それがどのように進むのかを見てみましょう... – exhuma
私は午後全体で2番目のサーバーで作業しているログを取得しようとしています。私の人生にとって、私はログ出力を得ることはできません。私は今、私のメッセージを「厳しい」ものにしました。まだ出力はありません... 'S.o.println()'で 'start-domain --verbose = true'を試みました。運がない...これは私の頭を傷つける。ここで働いているので、localhostから 'domain.xml'をコピーしようとします。 – exhuma