Spring Data с Hibernate и EhCache не работает - PullRequest
0 голосов
/ 22 марта 2020

Я включил кэш второго уровня и внедрил ehcache, я ссылался на многие документы, но, к сожалению, кэш второго уровня не работает, так как тот же самый запрос попадает в базу данных.

Ниже приведены действия - xml запись для entityManagerFactory.

    <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter"
        ref="hibernateJpaVendorAdapter" />
    <!-- Set JPA properties -->
    <property name="jpaProperties">
        <props>
            <prop key="javax.persistence.schema-generation.database.action">none</prop>
            <prop key="hibernate.ejb.use_class_enhancer">false</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
            <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
            <prop key="net.sf.ehcache.configurationResourceName">classpath:/module-config/ehcache.xml</prop>
        </props>
    </property>
    <!-- Set base package of your entities -->
    <property name="packagesToScan"
        value="com.conduent.business.api.lw.onb.backend.datahub.dto" />
    <!-- Set share cache mode -->
    <property name="sharedCacheMode" value="ENABLE_SELECTIVE" />
    <!-- Set validation mode -->
    <property name="validationMode" value="NONE" />

</bean>

ehCache. xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <defaultCache maxElementsInMemory="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120"
        overflowToDisk="false" diskPersistent="false" />

    <cache name="transactionTypeCache" maxElementsInMemory="300" eternal="false"
        timeToIdleSeconds="5000" timeToLiveSeconds="5000" overflowToDisk="false">
    </cache>
</ehcache>

TransactionType Entity

   @Entity
    @Table(name="ONB_TRANS_TYPE")
    @Cacheable(value = true)
    @Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region="transactionTypeCache")
    public class TransactionTypeDTO implements Serializable {

        private static final long serialVersionUID = -6630648311619744810L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID")
        private Integer             id;

        @Column(name = "TRANS_TYPE_NAME",unique=true)
        private String transTypeName;

        @ManyToOne
        @JoinColumn(name = "PARENT_ID")
        private TransactionTypeDTO parent;
    //getters and setters   
}

Репозиторий

@Repository
public interface TransactionTypeRepository extends CrudRepository<TransactionTypeDTO, Long>{

    TransactionTypeDTO findByTransTypeName(String string);

    List<TransactionTypeDTO> findByTransTypeNameIn(List<String> transTypes); 

    @Cacheable(cacheNames = "transactionTypeCache")
    TransactionTypeDTO findById(Integer id);    

}

Проверка кэша в Managerimpl.

@Override
public void secondLevelCache() {

    transactionTypeRepository.findById(1);

    System.out.println("Calling again !");

    transactionTypeRepository.findById(1);

}

У меня есть две проблемы -

  1. Всякий раз, когда я вызываю вышеуказанный метод, два запроса запускаются, но если кэш включен, в идеале он должен ударить базу данных только один раз.

    Hibernate: выберите top 2 transactio0_.ID в качестве ID14_, transactio0_.PARENT_ID как PARENT3_14_, transactio0_.TRANS_TYPE_NAME как TRANS2_14_ из ONB_TRANS_TYPE transactio0_, где transactio0_.ID =? Звоню снова! Спящий режим: выберите верхние 2 transactio0_.ID в качестве ID14_, transactio0_.PARENT_ID в качестве PARENT3_14_, transactio0_.TRANS_TYPE_NAME в качестве TRANS2_14_ из ONB_TRANS_TYPE transactio0_, где transactio0_.ID =?

  2. выбрать 2 верхние строки?

Пожалуйста, дайте мне знать, что мне не хватает, чтобы включить кэш второго уровня.

...