2013-11-29 2 views
0

나는 db4o 인스턴스를 조정하여 어떤 일이 일어나는지 알아 내려고 노력하고 있지만 이것은 정말로 나를 미치게 만듭니다. 그것은 단순히 나에게 의미가 없습니다.db4o : 심각한 문제와 incoherences

기본적으로 두 개의 객체를 만들고 두 번째 객체의 ArrayList에 첫 번째 객체를 저장합니다. 그런 다음 첫 번째 객체를 모두 제거하여 전체 데이터베이스를 만들고 처음에 저장 한 목록에서 제거하려고합니다.

다음은 현재 실행중인 작업의 기본 목록입니다. 이때

User user = new User("user"); 
Device device = new Device("device"); 
objectContainer.ext().store(user,5); // object storing depth 
objectContainer.commit(); 

objectContainer.delete(device); 

//objectContainer.close(); 
//objectContainer = new ... 

I 닫고 난 (보통 피해야 정상 주행 애플리케이션으로) 용기를 가까이하지 않는 경우 동시에 I가 deviceList 널 객체를 포함하는 사용자 objectContainer을 재개하는 경우는 디바이스 오브젝트는 여전히 전체 데이터베이스에있는 것은 아니지만 사용자 개체 내부에 있어야합니다.

null 개체가없는 목록과 데이터베이스에서 개체를 제거하기 만하면됩니다. 이것이 가능한가?? 많은 구성 (weakReferences, activations, constraints, ...)을 많이 시도했지만 성공하지 못했습니다.

답변

1

왜 다시 열어 본 후에 목록에 개체가 남아 있습니까?

  • 개체를 삭제하면 데이터베이스에서 삭제됩니다.
  • 그러나 db4o는 메모리 내용을 수정하지 않습니다. 따라서 다시 열기 전에 컬렉션은 해당 컬렉션의 메모리 표현에서 '오래된'컬렉션입니다. 여전히 개체에 대한 참조를 포함합니다. db4o는 제거하지 않습니다.
  • 다시 여는 중 : 컬렉션이 데이터베이스에서로드됩니다. 객체가 데이터베이스에서 제거되었으므로 더 이상 존재하지 않는 객체에 대해 'null'참조가 사용됩니다.

db4o는 메모리 개체에서 '마법 적으로'개체를 '제거'하지 않습니다. 당신은 개체 모델이 메모리 개체 그래프의 다른 같은 일관된 상태를 가지고 있는지 확인해야 \ 여기

몇 가지 팁입니다. http://community.versant.com/documentation/reference/db4o-8.1/net/reference/Content/best_practises/managing_relations.htm

+0

은 분명히이 두 데이터베이스에서이 예제를 보여 제거되지 않습니다; – giulio

+0

개체는 실제로 캐시의 다른 개체에서 액세스 할 수없는 경우에만 제거됩니다. 따라서 객체를 제거하는 데 필요한 모든 지점에서 객체를 제거해야합니다. – Galigator

+0

이제 관계가 수동으로 유지되도록 DBManager를 다시 만들었습니다. 나는 캐시 때문에 그것을 피할 수있는 가능성이 없다고 생각합니다. 객체를 java 힙에 보관하고 다시 시작하자마자 제거 되었기 때문에 db를 직접 읽으려는 시도조차 불가능했습니다. – giulio