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. 获取/放入会话对象不是线程安全的。在您的情况下,由于您在会话中存储与特定用户相关的数据,因此只要您不希望同一用户执行可以同时更新会话的多个操作,这样做是安全的。话虽如此,如果你真的在开发一个生产就绪的系统,并且在这种情况下你将拥有多个应用程序服务器,你需要考虑你的会话管理策略——你可以在网络服务器上使用粘性会话(Apache httpd例如)以便属于同一会话的所有请求都转发到同一应用服务器,或者您需要在应用服务器之间启用会话复制。

  2. ABC增长非常大,需要量化。如果您假设它的大小增长到 1MB,并且如果您为应用服务器的 JVM 分配了 2GB RAM,并假设其中 1GB 可用于应用程序的内存需求,那么您最多可以存储 1000 个用户的数据。根据您计划支持的并发会话数,您必须配置适量的 RAM。

  3. 如果 ABC 存储临时数据,例如购物车信息,并且在服务器重启期间您可以丢失这些数据,那么您的方法是可以的。如果不想丢失数据,那么可以考虑使用缓存系统,或者键值类型的 NoSQL 存储(CouchBase、Redis 等)。RDBMS 也是一种选择,但它实际上取决于您试图在会话中维护的数据的性质,以及它们是否真的具有会话语义,或者您只是为了方便而将它们存储在会话中。

于 2013-07-20T19:55:12.600 回答