2016-10-04 9 views
2

나는 나의 어플리케이션에서 가지고있는 어플리케이션 흐름에 대한 자세한 설명을하고있다. 데이터베이스 뷰어 응용 프로그램을 작성 중입니다. 사용자는이 응용 프로그램으로 내 DB의 모든 레코드 (행)를 볼 수 있으며 UI에서 편집 할 수 있습니다. 이 응용 프로그램이 잘 작동합니다. 이제 DB에 버전 필드를 만들었 기 때문에 Optimistic Locking을 구현하고 싶습니다. 이제는 디자인 문제로 쳤다.Spring MVC 하이버 네이트는 응답과 요청 사이에 자바 객체를 저장한다.

내 응용 프로그램에서 사용자가 레코드를보고 편집하고 싶을 때 내 컨트롤러 메서드에서 최대 절전 모드로드를 수행하고 JSP 페이지 편집 결과를 표시하고있다. 이제 사용자가 페이지에서 '저장'을 클릭하면 레코드를 저장해야합니다. 매우 복잡한 엔티티이므로 DB에서이 엔티티를 채우고 변경 사항을 작성하고 최대 절전 모드로 저장 또는 업데이트를 수행합니다.

이제 버전 관리를 구현하고자하므로 저장 또는 업데이트하기 전에 더 이상 엔터티를 채우고 싶지 않습니다. 어떻게 든 복잡한 엔티티를 안전하게 유지하고 업데이트하고 싶을 때 사용하고 싶습니다. 필자의 경우 JSP 숨김 양식 필드를 사용할 수 없습니다. 사용자가 '저장'버튼을 클릭하고 db로 저장하기 전까지 엔티티를 안전하게 유지할 수있는 곳은 어디입니까? 가능한 최선의 접근법은 무엇입니까?

업데이트 : EHCache는 프레임 워크를 구현하기 위해 인터넷 및 계획의 여러 게시물을 검토 한

. (숨겨진 양식 필드에)

저장소 (세션) 서버의 상태 또는 클라이언트 :

+2

세션은 분명히 알 수 있습니다. http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html –

+0

@AlanHay하지만 어쨌든 이제 내가 할 때 (session.getAttribute ("obj")). equals (DAO. get (...))이 일치하지 않습니다. 나는 거짓말을하고있다. 개체의 모든 멤버 변수에 대해 eqauls 메서드를 확인했습니다. 그들은 평등해야합니까? – EagleRider

답변

1

당신은 두 가지 옵션이 있습니다. HMAC를 사용하여 클라이언트 데이터를 보호 할 수 있지만 처리 시간이 필요합니다. @SessionAttributes가 무엇인지입니다 Spring MVC: Validation, Post-Redirect-Get, Partial Updates, Optimistic Concurrency, Field Security

+0

감사합니다 @Neil – EagleRider

+0

세션을 사용하는 것 외에 어떤 옵션이 있습니까? 왜 내가 주장하는 이유는, 우리는 부담 서버 (우리는 더 많은 세션을 위해 메모리 소비를 멈추기를 원합니다) 이상을 원하지 않는다는 것입니다. Hibernate 캐싱 또는 타사 지원을 사용하여 객체를 캐시하는 방법이 있습니까? – EagleRider

+0

@EagleRider 브라우저에 숨겨진 양식 필드에 상태를 저장할 수 있습니다. –

0

: 나는 편리 내 대답은 여기 낙관적 잠금으로 세션을 사용하는 방법의 예를 포함

을위한 서버 측 세션을 권하고 싶습니다. 어딘가에 객체를 저장해야하는 방법에 관계없이 자신 만의 객체를 찾아서 혼란에 빠뜨리거나 기본 솔루션을 사용할 수 있습니다.

@SessionAttributes("your-model") 
@Controller 
public class YourController { 

    @RequestMapping(method = GET) 
    public String show(long id, Model model) { 
     // Get your entity 
     model.addAttribute("your-model", entity); 
     return "edit"; 
    } 

    @RequestMapping(method = POST) { 
    public String show(@Valid @ModelAttribute("your-model") YourModel model, SessionStatus status) { 
     // Save your entity 
     status.setComplete(); 
     return "list"; 
    } 
} 

구현 방법에 관계없이 메모리에 부분적으로 데이터가 있어야합니다. 그리고 앞서 언급했듯이 자체 솔루션에서 해킹을 시도하거나 기본 스프링 메커니즘을 사용할 수 있습니다.

EhCache와 같은 솔루션이 메모리에 캐시되지만 필요한 경우 다른 저장소로 오프로드 할 수 있습니다. 컨테이너에 따라 세션과 동일하게 구성 할 수 있습니다. 또는 다른 옵션을 사용하려면 Spring Session과 같은 것을 사용하십시오.

어쨌든 세션에 저장하는 것으로 시작한 다음 측정을 시작하고 실제로 문제가되면 요청 사이에 엔티티를 저장하는 다른 방법을 찾아보십시오. 그러나 발생할 수있는 문제를 해결하는 대신 간단히 시작하고 측정하고 개선하십시오.

+0

@ m-deinum 제 경우에는 세션을 사용하여 문제가 분산 된 프로덕션 환경입니다. 그들은 모든 요청이 동일한 서버로 전달된다는 보장을하지 않습니다. 어떻게 이런 경우에 세션을 사용할 수 있습니까? – EagleRider

+0

언급했듯이 Spring Session을 사용할 수 있습니다 (링크는 답변에 포함되어 있습니다). –