bla*_*sei 6 caching hibernate jpa spring-data
我实际上并不确定我是否正在做正确的事情但我发现在使用域POJO顶部的缓存或可缓存注释并设置hibernate.cache.use_query_cache
为true以在缓存开始工作之前必须在JpaRepository查询方法上添加@QueryHint时,这样做太过分了.
据我所知,在界面级别声明方法是使用spring-data-jpa使所有东西如此精简的原因.
除非我添加@QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
到接口下面查询不会缓存
public interface UserRepository extends JpaRepository<User,String> {
@QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
User findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)
Spring db应用程序配置
<?xml version="1.0" encoding="UTF-8"?>
<beans ...">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${h2.jdbc.driverClassName}"/>
<property name="url" value="${h2.jdbc.url}"/>
<property name="username" value="${h2.jdbc.username}"/>
<property name="password" value="${h2.jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="flyway">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="normal"/>
<property name="packagesToScan" value="net.personal.tutorials.security.domain"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<!--..... -->
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</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>
</props>
</property>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
<jpa:repositories base-package="net.personal.tutorials.security.repository"/>
Run Code Online (Sandbox Code Playgroud)
persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!--<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">-->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="normal" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
ehcache.xml中
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true"
monitoring="autodetect"
dynamicConfig="true">
<defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="900" />
<!--<diskStore path="java.io.tmpdir" />-->
<cache name="net.personal.tutorials.security.domain.User"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
eternal="false"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
Run Code Online (Sandbox Code Playgroud)
net.personal.tutorials.security.domain.User
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Id
private String Id;
@Column(name = "email", length = 255, unique = true)
private String email;
private String password;
private String comment;
//setters and getters
}
Run Code Online (Sandbox Code Playgroud)
使用二级缓存的最佳推荐方法是什么?
谢谢
归档时间: |
|
查看次数: |
2209 次 |
最近记录: |