2016-10-07 10 views
2

캐시가 활성화 된 스프링 부팅 응용 프로그램을 사용하고 있습니다.EnableCaching을 사용한 스프링 부팅 응용 프로그램 guava 캐시 내용 검색 방법

환경 (pom.xml 파일) :

봄 :

org.springframework.boot:spring-boot-starter-amqp:jar:1.3.3.RELEASE 
org.springframework:spring-messaging:jar:4.2.5.RELEASE 
org.springframework.amqp:spring-rabbit:jar:1.5.4.RELEASE 
org.springframework.retry:spring-retry:jar:1.1.2.RELEASE 
org.springframework:spring-core:jar:4.2.5.RELEASE:compile 
org.springframework.cloud:spring-cloud-aws-context:jar:1.0.4.RELEASE 
org.springframework:spring-context:jar:4.2.5.RELEASE 
org.springframework.data:spring-data-jpa:jar:1.9.4.RELEASE 
org.springframework:spring-context-support:jar:4.2.5.RELEASE 

최대 절전 모드

org.hibernate:hibernate-validator:jar:5.2.2.Final 
org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final 
com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:jar:2.6.5 
org.hibernate:hibernate-entitymanager:jar:5.1.0.Final 
org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final 
org.hibernate:hibernate-java8:jar:5.1.0.Final 
org.hibernate:hibernate-envers:jar:5.1.0.Final 

구성 캐시 (봄 부팅 응용 프로그램에) :

하이버 네이트 엔티티 :

@Entity 
@Table(name = Configuration.TABLE_NAME) 
@DynamicUpdate 
public class Configuration implements Serializable { 

    public static final String TABLE_NAME = "configuration"; 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "id") 
    @Convert(converter = ConfigurationConverter.class) 
    private ConfigurationEnum id; 

    @Column(name = "service", nullable = false) 
    @NotNull 
    @Convert(converter = ServiceConverter.class) 
    private ServiceEnum service; 

} 

저장소 (스프링 데이터)

public interface ConfigurationRepository extends PagingAndSortingRepository<Configuration, Integer>, 
     JpaSpecificationExecutor<Configuration> { 

    @Cacheable(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME) 
    Configuration findById(ConfigurationEnum configurationEnum); 

    @Cacheable(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_SERVICE_ID_CACHE_NAME) 
    List<Configuration> findByService(ServiceEnum service); 

} 

구성 ENUM의

@Getter 
@AllArgsConstructor 
public enum ConfigurationEnum { 

    CONFIG_1(1), 
    CONFIG_2(2); 

    private int id; 
} 

구성 변환기 :

@Converter 
public class ConfigurationConverter implements AttributeConverter<ConfigurationEnum, Integer> { 

    @Override 
    public Integer convertToDatabaseColumn(ConfigurationEnum key) { 
     return key == null ? null : (int) key.getId(); 
    } 

    @Override 
    public ConfigurationEnum convertToEntityAttribute(Integer key) { 

     return key == null ? null : Stream.of(ConfigurationEnum.values()) 
        .filter(step -> key.equals(step.getId())) 
        .findFirst() 
        .orElse(null); 
    } 
} 

시험 IT :

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ApplicationIT.class) 
@WebAppConfiguration 
@Transactional 
public class ConfigurationCacheIT { 

    @Autowired 
    ConfigurationRepository configurationRepository; 

    @Autowired 
    protected CacheManager cacheManager; 

    @Test 
    public void configuration_findById_cache_success() { 

     Configuration config = configurationRepository.findById(ConfigurationEnum.CONFIG_1); 
     // An ORM request is performed - CHECK 
     Assert.assertNotNull(step); // TEST OK 
     Cache.ValueWrapper entry = getCacheEntry(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME, ConfigurationEnum.CONFIG_1.getId()); 
     Assert.assertNull(entry); OK 

     config = configurationRepository.findById(ConfigurationEnum.CONFIG_1); 
     // No ORM request is performed - CHECK 
     Assert.assertNotNull(step); // TEST OK 

     entry = getCacheEntry(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME, ConfigurationEnum.CONFIG_1.getId()); 
     Assert.assertNotNull(entry); **// TEST FAIL !!!** 

     entry = getCacheEntry(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME, ConfigurationEnum.CONFIG_1.name()); 
     Assert.assertNotNull(entry); **// TEST FAIL !!!** 

     entry = getCacheEntry(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME, ConfigurationEnum.CONFIG_1); 
     Assert.assertNotNull(entry); **// TEST FAIL !!!** 
    } 

    protected Cache.ValueWrapper getCacheEntry(String cacheName, Object key) { 
     return cacheManager.getCache(cacheName).get(key); 
    } 

    @Test 
    public void configuration_findByAll_without_cache_success() { 

    ArrayList<Configuration> list1 = Lists.newArrayList(configurationRepository.findAll()); 
    // An ORM request is executed 
    Assert.assertNotNull(list1); 
    Assert.assertEquals(ConfigurationEnum.values().length, list1.size()); 

    ArrayList<Configuration> list2 = Lists.newArrayList(configurationRepository.findAll()); 
    // Another ORM request is executed 
    Assert.assertNotNull(list2); 
    Assert.assertEquals(ConfigurationEnum.values().length, list2.size()); 
    } 

} 

제 질문이 내 테스트에 실패한 이유는 무엇입니까?

+0

의 핵심은 그래서 테스트가 단순히 항상 실패합니다 열거하지의 이름 또는 ID입니다. 테스트에서 분명히 캐싱을 사용할 수 없습니다. –

+0

두 번째 요청에서 볼 수있는 것처럼 "No ORM 요청이 수행되었습니다 - CHECK'' – Leonel

+0

캐싱과 아무 상관이 없습니다. 첫 번째 레벨 캐시에서 동일한 엔티티를 요청하면 nothign will 일이 생기면 첫 번째 레벨 캐시 즉 'EntityManager'에서 직접 가져옵니다. –

답변

0

사실 이것은 별다른 문제가 아닙니다.

  • 앱-MDW (미들웨어 층) (@EnableCaching 주석 봄 부팅 응용 프로그램)
  • 앱-WS (웹 서비스 층) (봄 :

    나는 fallowing 아키텍처를 사용하고 있습니다 @EnableCaching 주석없이 부팅 응용 프로그램)

위의 테스트는 응용 프로그램 앱-WS과에서 실행되었다 어노테이션은 상속되지 않으므로 캐싱이 작동하지 않습니다.

오른쪽 어설이었다

entry = getCacheEntry(ApplicationCacheConfig.CONFIGURATION_TABLE_FIND_BY_ID_CACHE_NAME, ConfigurationEnum.CONFIG_1); 
     Assert.assertNotNull(entry)