2010-05-25 11 views
7

이것은 매우 일반적인 상황이므로 좋은 해결책이 필요합니다. 기본적으로 테이블의 카운터를 업데이트해야합니다. 예를 들어 웹 페이지 방문으로 :최대 절전 모드로 카운터 업데이트

webPage.setVisitCount(webPage.getVisitCount()+1); 

이 문제는 거래에주의를 지불하지 않으면 기본적으로 MySQL의에서 읽

Web_Page 
-------- 
Id 
Url 
Visit_Count 

그래서 최대 절전 모드에서, 우리는이 코드가있을 수 있습니다. 따라서 인신 매매가 많은 웹 페이지는 부정확 할 수 있습니다.

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345; 

을 내 질문은 생각, 내가 Hibernate에서 어떻게 그렇게합니까 :

나는 것은 이런 종류의 일을 사용 해요 방법은 전화 단순히? 둘째, 어떻게하면 좀 더 복잡한 Hibernate에서 이와 같은 업데이트를 할 수 있습니까?

update Web_Page wp set wp.Visit_Count=(select stats.Visits from Statistics stats where stats.Web_Page_Id=wp.Id) + 1 where Id=12345; 

답변

5

문제는 거래에주의를 지불하지 않으면 기본적으로 MySQL의에서 읽습니다. 따라서 인신 매매가 많은 웹 페이지는 부정확 할 수 있습니다.

실제로. 내가 여기에 DML 스타일의 작업을 사용합니다 (장 13.4. DML-style operations 참조)

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

String hqlUpdate = "update webPage wp set wp.visitCount = wp.visitCount + 1 where wp.id = :id"; 
int updatedEntities = s.createQuery(hqlUpdate) 
     .setLong("newName", 1234l) 
     .executeUpdate(); 
tx.commit(); 
session.close(); 

둘째

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345; 

그리고 초래한다, 내가 Hibernate에서이 같은 업데이 트를 할 수있는 방법이다 조금 더 복잡한가?

흠 ... 나는 "당신이 망했다"는 말을하고 싶다는 생각이 들었습니다.

+0

파스칼에게 감사드립니다. 나는 HQL 내에서 UPDATE를 할 수 있는지 몰랐다. 쉽게 볼 수 있습니다. 그러나 좀 더 복잡한 예를 들자면 트랜잭션에주의를 기울이지 않는 동일한 SELECT 문제의 희생양이 될까요? 내가 어떻게 처리 할 것을 제안 하나? –

0

stored procedure 여러 가지 이점을 제공합니다

  1. 이 경우 스키마 변경에서 코드를 변경 할 필요가 call increment($id)
  2. 동시성 문제가 지역화 할 수 있다면.
  3. 많은 경우에 실행 속도가 빠릅니다.

가능한 구현은 다음과 같습니다있다

create procedure increment (IN id integer) 
begin 
    update web_page 
     set visit_count = visit_count + 1 
     where `id` = id; 
end 
관련 문제