我正在使用Spring Data JPA和Hibernate开发一个应用程序,并尝试使用EHCache启用二级缓存。我将我的应用程序分成两个项目:
CoreDataFacade的配置如下:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.7.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.7</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.33</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>3.6.0</version>
</dependency>
应用程序-context.xml
<jpa:repositories
base-package="com.coredata.services.impl.sql.mysql.repositories" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost/FOO" p:user="****" p:password="****"
p:acquireIncrement="5" p:minPoolSize="10" p:maxPoolSize="100"
p:maxIdleTime="1200" p:unreturnedConnectionTimeout="120" />
<bean id="jpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="MYSQL" p:showSql="true" p:generateDdl="true" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaVendorAdapter"
p:packagesToScan="com.coredata.services.impl.sql.mysql.model">
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
<prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
实体缓存注释
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region="cache_states")
@Table(name="states")
public class State implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_state")
private int idState;
...
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<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="cache_states" maxElementsInMemory="300" eternal="false"
timeToIdleSeconds="5000" timeToLiveSeconds="5000" overflowToDisk="false">
</cache>
</ehcache>
@Configuration
@PropertySource("classpath:/component.properties")
@ImportResource({ "classpath:/application-context.xml"})
@EnableAutoConfiguration(exclude = { JpaRepositoriesAutoConfiguration.class })
public class Application {
public void run(String... args) { }
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Hibernate: select count(state0_.id_state) as col_0_0_ from states state0_
Hibernate: select state0_.id_state as id_stat1_5_, state0_.name_state as name_e2_5_ from states state0_ limit ?
[2015-08-31 18:52:21.402] boot - 1946 INFO [SimpleAsyncTaskExecutor-1] --- StatisticalLoggingSessionEventListener: Session Metrics {
32992 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
238285 nanoseconds spent preparing 2 JDBC statements;
935976 nanoseconds spent executing 2 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
269717 nanoseconds spent performing 4 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
68790 nanoseconds spent executing 2 partial-flushes (flushing a total of 0 entities and 0 collections)
}
Hibernate: select count(state0_.id_state) as col_0_0_ from states state0_
Hibernate: select state0_.id_state as id_stat1_5_, state0_.name_state as name_e2_5_ from states state0_ limit ?
[2015-08-31 19:26:48.479] boot - 1946 INFO [SimpleAsyncTaskExecutor-1] --- StatisticalLoggingSessionEventListener: Session Metrics {
314930 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
356832 nanoseconds spent preparing 2 JDBC statements;
681615 nanoseconds spent executing 2 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
209324 nanoseconds spent performing 4 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
12368 nanoseconds spent executing 2 partial-flushes (flushing a total of 0 entities and 0 collections)
}
269717 nanoseconds spent performing 4 L2C puts;
209324 nanoseconds spent performing 4 L2C puts;
我希望第二个查询能够从缓存中检索数据,但it统计数据的命中和未命中数为零:
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
我的问题是:为什么当我执行第二个查询时,L2C命中和L2C未命中为零?
更新
这就是我运行查询的方式
重置
我正在使用QueryDSL和spring data JPA。我遵循本教程,使用QueryDslPredicateExecutor集成我的JPararePository
public interface StateRepository extends JpaRepository<State, Integer>, QueryDslPredicateExecutor<State> {
}
@Autowired
StateRepository repo;
public List<State> getStatesByFields(String options, Integer page, Integer pageSize,String order) {
PredicateBuilder predicateBuilder = new PredicateBuilder().onEntity("State")
Pattern pattern = Pattern.compile(OPERATION_PATTERN);
Matcher matcher = pattern.matcher(options + ",");
while (matcher.find()) {
predicateBuilder.with(matcher.group(1), matcher.group(2), matcher.group(3));
}
PageRequest pag = new PageRequest(page, page_size)
BooleanExpression predicate = predicateBuilder.build();
//findAll is provided by QueryDslPredicateExecutor interface
Page<State> result = repo.findAll(predicate, pag);
}
查询运行得像charm,但数据似乎没有被缓存。
实体缓存仅在使用其id(例如load()、get())检索实体时才起作用。如果使用查询,它就不起作用了。
要启用缓存查询,必须使用查询缓存。例如。
List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger")
.setEntity("blogger", blogger)
.setMaxResults(15)
.setCacheable(true)
.setCacheRegion("frontpages")
.list();
或使用jpa
query.setHint(“org.hibernate.cacheable”, true);
我正在尝试设置一个bootstrapcacheloader,它将查询数据库并填充缓存。在这里,我使用与Spring集成的ehcache。但问题是我无法将依赖项连接到我的cacheloader实现中。@Autowed、@Resources、@Configurable似乎都不起作用。很明显,cacheloader实例化不是由Spring容器完成的,但有没有一种方法可以将Spring创建的cachelo
让我澄清一下我对二级缓存的理解。在我的web应用程序的基类中有一个查询。几乎每一个操作都会调用此查询(我使用的是Struts,这就是应用程序的设计方式,因此不会真正弄乱它),例如,加载我的主页会调用三个单独的Struts操作,并为每个操作执行此查询。QueryDsl形式的查询看起来像
我有一个运行Hibernate4.1.7的应用程序,并且正在使用ehcache作为2级缓存。我知道从冬眠4开始,我需要使用与冬眠捆绑在一起的ehcache罐子,但这些罐子已经很老了。 当前最新版本的ehcache是2.6.3,但hibernate 4.1.7附带的版本是2.4.3。问题是hibernate没有与EhcacheTerracotta jar捆绑在一起,我的Terracott服务器也与E
我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下
下面是我的ehcache配置文件 所有Spring注释和配置都正常工作 但是缓存在timetoliveseconds之后无法清除。 谁能帮我一下我的配置有什么问题吗。 下面的页面说它是错误,但不知道如何解决这个问题? 我正在使用sping-boot-starter-cache-2.0.3版本 https://github.com/ehcache/ehcache-jcache/issues/26 有