2013-07-20 4 views
0

나는 스프링 범위의 초보자입니다.스프링 컨트롤러 범위 및 세션 데이터 저장

ABC는 루트 개체이며 트리 구조를 포함하고 사용자 조치가 하위 개체의 아무 곳이나 변화를 수반하므로 ABC 개체가 동일한 사용자 세션에서 여러 번 변경할 수 있기 때문에

@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는 매우 커질 수 있으며 이것이 내 관심사입니다. 이렇게하는 것이 좋은 방법입니까?

이 코드를 작성하는 것이 좋은 방법인지 알고 싶습니다. 이 스레드는 안전한 방법입니까? 최선의 대안은 무엇입니까?

답변

0
  1. 세션 개체 가져 오기/가져 오기가 스레드로부터 안전하지 않습니다. 귀하의 경우, 세션에 특정 사용자와 관련된 데이터를 저장하고 있기 때문에 동일한 사용자가 동시에 세션을 업데이트 할 수있는 여러 작업을 수행 할 것으로 예상하지 않는 한 안전하게 수행 할 수 있습니다. 그렇다면 실제로 프로덕션 준비 시스템을 개발 중이며 여러 애플리케이션 서버로 끝나게 될 경우 세션 관리를위한 전략이 무엇인지 생각해야합니다. 웹 서버 (Apache httpd)에서 고정 세션을 사용할 수 있습니다. 예를 들어 동일한 세션에 속한 모든 요청이 동일한 응용 프로그램 서버로 전달되거나 응용 프로그램 서버간에 세션 복제가 가능하도록해야합니다.

  2. 매우 커질 필요가있는 ABC가 계량화되어야합니다. 크기가 1MB가되고 응용 프로그램 서버의 JVM에 2GB RAM을 할당하고 응용 프로그램의 메모리 요구 사항에 대해 1GB를 사용할 수 있다고 가정하면 1000 명까지의 데이터를 저장할 수 있습니다. 지원하려는 동시 세션 수에 따라 적절한 양의 RAM을 구성해야합니다.

  3. ABC가 장바구니 정보처럼 일시적인 데이터를 저장하고 서버를 다시 시작하는 동안 잃을지도 모르는 접근 방법이라면 문제가 없습니다. 데이터를 잃고 싶지 않으면 캐시 시스템 또는 Key-value 유형의 NoSQL 스토어 (CouchBase, Redis 등)를 사용할 수 있습니다. RDBMS도 옵션이지만 세션에서 유지하려고하는 데이터의 성격과 실제로 세션 의미론이 있는지 또는 편의를 위해 세션에 저장하고 있는지에 따라 달라집니다.

관련 문제