문제

우리는 J2EE 응용 프로그램에 캐싱 레이어를 만들었습니다. 이 경우 우리는 ehcache를 사용합니다. 이것은 몇 가지 도전을 만들었습니다.

이 예를 들어합시다.

OrderItem orderitem = cache.getOrderItemByID("id");
OrderItem old_orderitem = cache.getOrderItemID("id");

orderitem.setStatus(1);
old_orderitem.setStatus(2);

우리가 조심하지 않으면 해당 객체 중 하나에 대한 변경 사항은 다른 객체에 영향을 미칩니다 (동일한 개체를 참조). Dabase에 순서를 다시 저장하면 상태 = 2 상태가됩니다.

우리는 이것을 가장 좋은 방법으로 어떻게 해결할 것입니까?

각 객체에 .copyobject () 메소드를 만들려고했습니다. 새로운 객체를 생성하고 모든 값을 설정합니다. 그러나 이것은 좋은 해결책처럼 보이지 않습니다.

그 예는 단지 설명하는 것이 었습니다. 코드는 그보다 훨씬 더 복잡하지만 결과는 동일합니다.

********************** UPDATE 15.07.2010 ********************** **************************

ehcache 2에는 copyread () 및 copywrite ()를 켜는 몇 가지 옵션이 있습니다. 그리고 이것은 내 모든 문제를 해결합니다 :)

도움이 되었습니까?

해결책

이것은 돌연변이 상태의 문제입니다. 캐싱뿐만 아니라 동일한 객체에 대한 여러 참조를 가질 수 있고 해당 물체가 변하지 않습니다. 예를 들어:

HashMap map = new HashMap();
map.put("one", new OrderItem());
OrderItem one = map.get("one");
OrderItem two = map.get("one");
one.setStatus(1);
two.setStatus(2);

정확히 같은 문제가 있습니다. 동시 환경이있을 때 이것은 훨씬 더 복잡해집니다. 이것을 해결하는 한 가지 방법은 불변의 물건 만있는 것입니다. 그렇게하면 상태가 다른 객체를 원한다면 새로운 개체를 만들어야합니다. 또한 동시 프로그래밍을 더 쉽게 만듭니다.

당신은 객체를 복사하는 것을 고려할 권리가 있습니다. 귀하의 옵션은 다음과 같습니다.

각각의 강점과 약점이 있으며 가장 잘 작동하는 것은 환경에 달려 있습니다.

다른 팁

객체 자체가 아닌 객체 (예 : 데이터베이스 쿼리의 결과)를 나타내는 데이터를 캐시하려는 것처럼 들립니다 (예 : 다른 곳에서 검색하려는 사용자의 세션 데이터).

이 경우 사용자가 요청을 할 때 사용자 정의 캐시 레이어 (ehcache 주변)는 캐시 데이터에서 객체를 만들어야합니다. 이렇게하면 매번 고유 한 객체가 제공되며 객체 간섭이 발생하지 않습니다.

ID (getOrderItemByid)로 캐시에서 검색 할 때 "개체를 얻는다는 것을 의미한다고 가정합니다. 독창적입니다 Id =? "

고유성 -ID = "ID"는 항상 같은 객체입니다. 상태를 설정 한 다음 재설정하면 동일한 객체에 새 상태가 있음을 의미합니다. ID가 일치하는 경우 .equals 메소드를 확장하여 True를 반환하고 싶을 것입니다.

"더러운"플래그를 사용하여 (트랜잭션?) 데이터 저장소에서 변경된 객체를 표시 할 수도 있습니다.

사본을 만드는 것은 이것을 다루는 나쁜 방법은 아니지만, 동일한 ID로 2 개의 객체를 주위에 실행한다는 것이 무엇을 의미하는지 명확하지는 않습니다. 캐시에 아직 존재하지 않음을 나타 내기 위해 널 ID로 사본을 만들어야할까요?

응용 프로그램에 대한 올바른 행동은 무엇입니까?

Ehcache는 명시 적 잠금 API를 통해 잠금 키를 지원합니다. 읽기 및 쓰기 잠금으로 캐시의 키를 잠글 수 있습니다. 이것은 캐시의 값을 고정시키지 않으므로 프로그래머가 결정하면 물체가 여전히 돌연변이에 열려 있습니다.

이것은 당신이 그것을 보는 방법에 따라 언급 한 문제를 해결하거나 해결하지 않을 수 있습니다. 프로그래머가 징계를 받고 읽기 목적으로 만 읽기 획득 된 개체를 사용하고 키에 쓰기 잠금으로 획득 한 개체를 획득 할 때 + 업데이트 캐시를 수정하면 작동해야합니다.

그러나 Jamie McCrindle이 언급 한 바와 같이 변한 상태 문제는 사라지지 않습니다.

참조: http://ehcache.org/documentation/explicitlocking.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top