2010-12-11 19 views
1

私はいくつかの「シーン」の詳細を取得し、jspページ内に表示する次のマッピングを持っています。Spring MVCコントローラ内のModelAndViewとbyte []

@RequestMapping(value="/{id}",method = RequestMethod.GET) 
    public ModelAndView showScene(@PathVariable String id){ 
     ModelAndView mv = new ModelAndView("/Scene/scene"); 
       //retrieving Scene using Hibernate     
       Scene scene = service.getScene(Long.parseLong(id)); 
     mv.addObject("name", scene.getName()); 
       mv.addObject("desc", scene.getDescription()); 
       //etc.... 
     return mv; 
    } 

私の問題は、シーンオブジェクトのフィールドの1つがbyte []としてpngイメージであり、表示する必要があることです。私は、すべての.png拡張要求を処理し、byte []を返す別のコントローラを作成できることを理解しています。ような何か:

<servlet-mapping> 
    <servlet-name>PNGHandler</servlet-name> 
    <url-pattern>*.png</url-pattern> 
    </servlet-mapping> 

として画像への参照を送る:

mv.add("image", "image/"+scene.getId()+".png"); 

が、その後、私はPNG形式のコントローラで再び[]バイトを取得する必要がありますし、それは私に、追加のHibernateのトランザクションの費用がかかります。このトランザクションを保存し、バイト[]を2回取得しないようにするための回避策はありますか?

ありがとうございます。

答えて

1

私が言う - 異なる休止マッピングされたエンティティ(?多分画像)にバイトを分離し、そしてシーンはレイジーロード関係を経由して、それを参照してくださいします。

次に、あなたが実際にそれらを必要とする場合にのみ、イメージをロードする力を持つことになります。すでに述べたように、showSceneを実行しているコントローラーはイメージをロードする必要はなく、別のコントローラーで処理することができます。この

利点は次のようになります。

  • あなたがブラウザで特定の時間キャッシュする画像を設定することで、アプリのパフォーマンスを向上させることができます。これは、イメージをロードするコントローラが常にヒットすることはなく、サーバー側の負荷を軽減することを意味します。ただし、セッションに画像を保存すると、設定されたキャッシュ設定に関係なく、常に画像がロードされます。
  • showSceneのすべてのリクエストが成功するとは限りません。また、画像を表示する必要があります。常に画像を強制的に読み込むことは、大変な労力を要するようです。
  • これは個人的な好みかもしれませんが、私はセッションをできるだけクリーンで軽く保つのが好きです。
  • サーバー側のキャッシュは良いアイデアですが、セッションでキャッシュしないでください。 Hibernateの2番目のレイヤーキャッシング - すべてのユーザーが共有するものはどうですか?
2

最も簡単な解決策は、セッションにbyte[](またはSceneオブジェクト全体)を格納し、セッションからフェッチしてクライアントに戻す2回目の要求を格納する最初の要求です。固定キーの下にセッション内のデータを保存したり、毎回新しいキーを生成したり、そのキーの下のセッションに格納したり、ページをレンダリングするときにそのキーを<img> URLにエンコードすることができます。

セッションにあまりにも多くのイメージを置かないように注意する必要があります。検索した後にイメージを削除したり、一度に1つだけセッションを許可したりすることができます。

+0

はい、私はセッションを使用することができますyou.Sureに感謝し、私は:) –

+0

@dannyことを行うには「Spring MVCの」道のようなものを考えていた:あなたはそれを行うためにSessionAttributes' @ 'を使用することができますが、中私の意見では、それは価値がありません - 生のセッションオブジェクトを使用するだけです。 – skaffman

+0

セッションを使用すると、アプリケーションの拡張が妨げられる可能性があります(たとえば、2つのWebサーバーがあり、その両方でセッションを実現可能にする必要がある場合など)。そして、すでに言及したように、あなたはセッションの数に注意する必要があります:セッションがたくさんある(そして大きな)セッションが残っているなら、このソウルシップは、あなたがデータベースにアクセスするとパフォーマンスをさらに悪化させます二度。セッションが永続化されると、配列を書き込んで再度読み取る必要があるためです。これは、データベースから読み取るよりもはるかに遅くなります。 – Ralph

1

Hibernateはあなたがやったようにページを含む属性http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-lazyproperties

私は春の道は2つのコントローラのメソッドを使用することです信じ

、いずれかの遅延読み込み提供し、2つ目は、画像のみを返します。

パフォーマンスが怖い場合は、バイト配列にhibernateプロパティlazyloadingを使用できます。したがって、名前とその他のもの(配列を除く)のみを使用すると、配列はロードされません。

しかし、私が知る限り、プロパティレイジーローディングには、ある種のバイトコードの改善が必要です。したがって、これが大きな問題であれば、マップされたクラスによってロードするのではなく、クエリで直接属性をロードすることが考えられます。

関連する問題