Я включил кэш второго уровня и внедрил 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);
}
У меня есть две проблемы -
Всякий раз, когда я вызываю вышеуказанный метод, два запроса запускаются, но если кэш включен, в идеале он должен ударить базу данных только один раз.
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 верхние строки?
Пожалуйста, дайте мне знать, что мне не хватает, чтобы включить кэш второго уровня.