Skip to content

Commit

Permalink
DATACMNS-1364 - Store persistent properties in ConcurrentHashMap.
Browse files Browse the repository at this point in the history
We now use ConcurrentHashMap to store persistent properties of a PersistentEntity and to prevent eviction caused by GC activity. Previously, we used ConcurrentReferenceHashMap defaulting to soft references. Soft references can be cleared at the discretion of the GC in response to memory demand. So a default ConcurrentReferenceHashMap is memory-sensitive and acts like a cache with memory-based eviction rules.

Persistent properties are not subject to be cached but elements of a PersistentEntity and cannot be recovered once cleared.

Original pull request: #304.
  • Loading branch information
mp911de authored and odrotbohm committed Aug 14, 2018
1 parent 13b1150 commit 9edf2e5
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public BasicPersistentEntity(TypeInformation<T> information, @Nullable Comparato
this.constructor = PreferredConstructorDiscoverer.discover(this);
this.associations = comparator == null ? new HashSet<>() : new TreeSet<>(new AssociationComparator<>(comparator));

this.propertyCache = new ConcurrentReferenceHashMap<>();
this.propertyCache = new ConcurrentHashMap<>();
this.annotationCache = new ConcurrentReferenceHashMap<>();
this.propertyAnnotationCache = CollectionUtils.toMultiValueMap(new ConcurrentReferenceHashMap<>());
this.propertyAccessorFactory = BeanWrapperPropertyAccessorFactory.INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,24 +138,27 @@ public void considersComparatorForPropertyOrder() {
assertThat(entity.getPersistentProperty("ssn")).isEqualTo(iterator.next());
}

@Test // DATACMNS-186
@Test // DATACMNS-18, DATACMNS-1364
public void addingAndIdPropertySetsIdPropertyInternally() {

MutablePersistentEntity<Person, T> entity = createEntity(Person.class);
assertThat(entity.getIdProperty()).isNull();

when(property.getName()).thenReturn("id");
when(property.isIdProperty()).thenReturn(true);
entity.addPersistentProperty(property);
assertThat(entity.getIdProperty()).isEqualTo(property);
}

@Test // DATACMNS-186
@Test // DATACMNS-186, DATACMNS-1364
public void rejectsIdPropertyIfAlreadySet() {

MutablePersistentEntity<Person, T> entity = createEntity(Person.class);

when(property.getName()).thenReturn("id");
when(property.isIdProperty()).thenReturn(true);
when(anotherProperty.isIdProperty()).thenReturn(true);
when(anotherProperty.getName()).thenReturn("another");

entity.addPersistentProperty(property);
exception.expect(MappingException.class);
Expand Down Expand Up @@ -429,7 +432,7 @@ static class PersistableEntity implements Persistable<Long> {

private final Long id = 42L;

/*
/*
* (non-Javadoc)
* @see org.springframework.data.domain.Persistable#getId()
*/
Expand All @@ -438,7 +441,7 @@ public Long getId() {
return 4711L;
}

/*
/*
* (non-Javadoc)
* @see org.springframework.data.domain.Persistable#isNew()
*/
Expand Down

0 comments on commit 9edf2e5

Please sign in to comment.