0

私はスプリングスコープの初心者です。

次のようなコードがあります

   @Controller
   public class PageController extends AbstractController {

private ABCManager abcManager;// repository singleton bean.

@Inject
public PageController(final ABCManager accountDiaryManager){
    this.abcManager= abcManager;
}

    @RequestMapping(value="/createpage",method=RequestMethod.POST)
public @ResponseBody Page createPage(@RequestParam(value="viewtype")final String viewtype, final WebRequest request)
    {
    final ABC abc= (abc) request.getAttribute(AbstractController.CURRENT_ABC, WebRequest.SCOPE_SESSION);

        .........
       abcManager.createPage(Long.valueOf(abc.getId()), page);
request.setAttribute("abc", abcManager.getabc(abc.getId()),WebRequest.SCOPE_SESSION);
 }

abc オブジェクトは同じユーザー セッション内で何度も変更される可能性があるため、abc はルート オブジェクトであり、ツリー構造が含まれており、ユーザー アクションにはサブ オブジェクト内の任意の場所の変更が含まれます。したがって、編集が実行されると、変更された abc オブジェクトをリクエスト内に保存して、リクエスト内で常に最新の abc オブジェクトを使用できるようにします。このabcは非常に大きくなる可能性があり、それが私の懸念事項です. このようにするのは良い方法ですか?

これがこのようなコーディングの良い習慣であるかどうかを知りたいです。これはスレッドセーフな方法ですか?利用可能な最良の代替手段は何ですか。

4

1 に答える 1

0
  1. セッション オブジェクトへの Get/Put はスレッド セーフではありません。あなたの場合、特定のユーザーに関連するデータをセッションに保存しているため、同じユーザーが同時にセッションを更新できる複数のアクションを実行することを期待しない限り、そうしても安全です。そうは言っても、本番対応のシステムを実際に開発していて、複数のアプリケーション サーバーを使用することになる場合は、セッション管理の戦略を考える必要があります。Web サーバー (Apache httpd) でスティッキー セッションを使用できます。たとえば、同じセッションに属するすべてのリクエストが同じアプリ サーバーに転送されるようにするか、アプリ サーバー間でセッションのレプリケーションを有効にする必要があります。

  2. 非常に大きく成長している ABC を定量化する必要があります。サイズが 1 MB に増加すると仮定し、アプリ サーバーの JVM に 2 GB の RAM を割り当て、その 1 GB がアプリケーションのメモリ要件に対応できると仮定すると、最大 1000 ユーザーのデータを保存できます。サポートする予定の同時セッションの数に基づいて、適切な量の RAM を構成する必要があります。

  3. ABC がショッピング カートの情報などの一時的なデータを保存し、サーバーの再起動中に失われても問題ない場合、あなたのアプローチは問題ありません。データを失いたくない場合は、キャッシュ システム、またはキーと値のタイプの NoSQL ストア (CouchBase、Redis など) の使用を検討できます。RDBMSもオプションですが、セッションで維持しようとしているデータの性質と、それらが本当にセッションセマンティクスを持っているか、便宜のためにセッションに保存しているだけかによって異なります。

于 2013-07-20T19:55:12.600 に答える