【发布时间】:2016-06-23 19:06:44
【问题描述】:
我有点卡住,无法理解我的二级缓存配置有什么问题。 pom文件
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.11.Final</version>
</dependency>
</dependencies>
hibernate.cfg.xml:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
ehcache.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="200" />
<cache
name="version2Cache"
maxElementsInMemory="100000"
eternal="true"
overflowToDisk="false"
memoryStoreEvictionPolicy="LFU"
statistics="true"
/>
</ehcache>
实体:
@Entity
@Table(name = "version")
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="version2Cache")
public class VersionData implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 7355281418627668744L;
@Id
@Column(name="VERSION_ID")
private String versionId;
/**
* user docname
*/
@Column(name = "DOC_NAME")
private String docName;
/**
* user versionModivied
*/
@Column(name = "VERSION_MODIFIED")
@Type(type = "timestamp")
@JsonIgnore
private Date versionModivied;
/**
* user zvitId
*/
@ManyToOne
@JoinColumn(name="ZVIT_ID")
private ZvitData zvitId;
@OneToMany(targetEntity=TermData.class, mappedBy = "versionId", cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.LAZY)
private List<TermData> terms;
//getters, setters, hashcode, equals
}
然后我运行单元测试
@Test
public void testCache() throws ReportException
{
SessionFactory sessionFactory = ReportsFactory.getSessionFactory();
Session session = sessionFactory.openSession();
VersionData versionData = (VersionData) session.load(VersionData.class, "1");
System.out.println(versionData.getDocName());
session.close();
session = sessionFactory.openSession();
versionData = (VersionData) session.load(VersionData.class, "1");
System.out.println(versionData.getDocName());
session.close();
}
我在控制台中看到实际上有两个查询在数据库中运行,但是使用二级缓存应该有一个。
编辑: 谢谢你 Madhusudana Reddy Sunnapu。我的错误是我没有正确阅读控制台消息:( 我没有缓存嵌入式对象。看起来查询工作了两次。但第二次它并没有真正加载 VersionData,而是查询嵌入的对象。我错过了。很抱歉给您添麻烦。这真是我的愚蠢错误:(
【问题讨论】:
-
你在
.hbm.xml文件上使用过吗??? -
@Evgen 我没有看到配置有任何问题。你能在你看到两个查询的地方显示控制台输出吗?
-
我在我的实体 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="version2Cache") 中声明了缓存使用情况。我没有其他地方可以设置它
-
@Evgen 很高兴有帮助。 :)
标签: java hibernate second-level-cache