JPA入门
2015-11-27 08:17
330 查看
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域标准化整合者的目标应该不难实现。
JPA的总体思想和现有Hibernate、TopLink等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
lORM映射元数据
JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
lJava持久化API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
l查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
提示: JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate、TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
依赖的jar
Hiberante核心包(8个文件)
hibernate-distribution-3.3.1.GA
---------------------------------------------
hibernate3.jar
lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
Hiberante注解包(3个文件):hibernate-annotations-3.4.0.GA
------------------------------------------------------------------------------------
hibernate-annotations.jar
lib\ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate针对JPA的实现包(3个文件):hibernate-entitymanager-3.4.0.GA
------------------------------------------------------------------------------------------------------
hibernate-entitymanager.jar
lib\test\log4j.jar、slf4j-log4j12.jar
JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,配置模版如下:
<?xml version="1.0"?>
<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/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0">
<persistence-unit name="unitName" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect"value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.hbm2ddl.auto"value="update"/>
</properties>
</persistence-unit>
</persistence>
例子:
首先导入jar包
在src下放入META-INF/persistence.xml
<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_1_0.xsd"
version="1.0">
<persistence-unit name="unitName" transaction-type="RESOURCE_LOCAL">
<!-- EJB3中用于配置全局事务的 -->
<!--<jta-data-source>java:/DefaultDS</jta-data-source> -->
<properties>
<!--hibernate可以使用mysql5比较高级的特性 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<!-- 映射源数据没有发生改变的情况下,而且数据库中表已经存在,那么我们就不需要更新这张表 -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/>
</properties>
</persistence-unit>
</persistence>
定义实体类
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Entity
@Table(name = "person")
public class Person {
// 以下定义的id,name不是属性,是字段
private Integer id;
private String name;
private Date birthday;// 1987-12-10
private Gender gender = Gender.MAN;
private String info;
private Byte[] file;
private String imagepath;
@Transient//在表中就没有对应的字段
public String getImagepath() {
return imagepath;
}
public void setImagepath(String imagepath) {
this.imagepath = imagepath;
}
@Lob//大字段
@Basic(fetch=FetchType.LAZY)//懒加载特性
public Byte[] getFile() {
return file;
}
public void setFile(Byte[] file) {
this.file = file;
}
@Lob
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Enumerated(EnumType.STRING)//枚举类型,可以以数字还是字符串保存的时候
@Column(length = 5, nullable = false)//字段的一些属性
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Temporal(TemporalType.DATE)//日期类型,可以选择Date或者Time
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Person() {
}
public Person(String name) {
this.name = name;
}
@Id//标识主键
@GeneratedValue//自增长,默认为auto
// 属性是由get、set方法来决定的,数据库中字段对应的名称和getId一致,
// 因为d是小写,所以它之前的字母也是小写(第一个字母是否大小写由第二个字母决定)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 10, nullable = false, name = "personName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
调用JPA的API来实现CRUD
@Test
public void save(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
//-->sessionFactory-->session-->begin事务
//在得到sessionFactory的时候,就创建表
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
em.persist(new Person("熊诗言"));
em.getTransaction().commit();
em.close();
factory.close();
}
//查询数据不需要开启事务,只有发生数据更改时才需要开启事务
@Test
public void getPerson(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Person person=em.find(Person.class, 1);//类似get()
// /**
// * 用了一分钟,数据库中的该条数据如果已经被修改,需要用refresh方法去获取最新的数据
// */
// em.refresh(person);
System.out.println(person.getName());
em.close();
factory.close();
}
//find和getReference的区别之一:当数据库没有该记录时,那么find返回的对象是null;
//getReference返回的对象在输出时,会报EntityNotFoundException异常,在执行(2)时报错
@Test
public void getPerson2(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Person person=em.getReference(Person.class, 1);//1
//类似load(),获得的只是代理类cglib
System.out.println(person.getName());//2
em.close();
factory.close();
}
//(事务管理的四种状态)new
//managed 托管
//游离(脱管)
//删除
@Test
public void updatePerson(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
//事务关联,处于托管状态,满足这两个条件时可以直接修改对象属性
person.setName("老张");
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void updatePerson2(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
em.clear();//把实体管理器中的所有实体变成游离状态
person.setName("老王");//这里同步不了
em.merge(person);//把游离状态下的实体bean更新同步回数据库
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void delete(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
em.remove(person);//只能删除托管状态的,也就是这个对象在我的管理下,数据库中也存在我才能删除
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void query(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Query query=em.createQuery("select o from Person o where o.id=?1");//问号明确从1开始,也可以o.id=:id
query.setParameter(1, 2);
List<Person> persons=query.getResultList();//query.getSingleResult()
for(Person person:persons)
System.out.println(person.getName());
em.close();
factory.close();
}
@Test
public void deletequery(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Query query=em.createQuery("delete from Person o where o.id=?1");
query.setParameter(1, 2);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void queryupdate(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Query query=em.createQuery("update Person o set o.name=:name where o.id=:id");
query.setParameter("name", "xxx");
query.setParameter("id", 3);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
JPA(hibernate)二级缓存配置
第一步:导入ehcache的ehcache.jar文件(hibernate中有)
第二步:在persistence.xml文件中添加下面配置项:
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
第三步:在实体类上面标注@Cache,如:@Cache(region="cn.itcast.bean.Person",usage=CacheConcurrencyStrategy.READ_WRITE)
第四步:在classpath下放入ehcache.xml,内容模版如下:
<?xml version="1.0"encoding="UTF-8"?>
<ehcache>
<diskStore path="D:\cache"/>
<defaultCachemaxElementsInMemory="1000" eternal="false"overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="60"/>
<cache name="cn.itcast.bean.Person"maxElementsInMemory="100" eternal="false"
overflowToDisk="true"timeToIdleSeconds="300"timeToLiveSeconds="600"diskPersistent="false"/>
</ehcache>
注意:<cache>节点中的name属性值要和@Cache(region="cn.itcast.bean.Person")中的region相同
ehcache.xml文件中各项属性说明如下:
defaultCache节点为缺省的缓存策略
maxElementsInMemory内存中最大允许存在的对象数量
eternal
设置缓存中的对象是否永远不过期
overflowToDisk把溢出的对象存放到硬盘上(对于本例而言,第1001个对象将存放在硬盘上)
timeToIdleSeconds指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
timeToLiveSeconds指定缓存对象总的存活时间
diskPersistent当jvm结束是是否持久化对象
diskExpiryThreadIntervalSeconds指定专门用于清除过期对象的监听线程的轮询时间
JPA的总体思想和现有Hibernate、TopLink等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
lORM映射元数据
JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
lJava持久化API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
l查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
提示: JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate、TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
依赖的jar
Hiberante核心包(8个文件)
hibernate-distribution-3.3.1.GA
---------------------------------------------
hibernate3.jar
lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
Hiberante注解包(3个文件):hibernate-annotations-3.4.0.GA
------------------------------------------------------------------------------------
hibernate-annotations.jar
lib\ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate针对JPA的实现包(3个文件):hibernate-entitymanager-3.4.0.GA
------------------------------------------------------------------------------------------------------
hibernate-entitymanager.jar
lib\test\log4j.jar、slf4j-log4j12.jar
JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,配置模版如下:
<?xml version="1.0"?>
<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/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0">
<persistence-unit name="unitName" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect"value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/>
<property name="hibernate.hbm2ddl.auto"value="update"/>
</properties>
</persistence-unit>
</persistence>
例子:
首先导入jar包
在src下放入META-INF/persistence.xml
<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_1_0.xsd"
version="1.0">
<persistence-unit name="unitName" transaction-type="RESOURCE_LOCAL">
<!-- EJB3中用于配置全局事务的 -->
<!--<jta-data-source>java:/DefaultDS</jta-data-source> -->
<properties>
<!--hibernate可以使用mysql5比较高级的特性 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<!-- 映射源数据没有发生改变的情况下,而且数据库中表已经存在,那么我们就不需要更新这张表 -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/>
</properties>
</persistence-unit>
</persistence>
定义实体类
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Entity
@Table(name = "person")
public class Person {
// 以下定义的id,name不是属性,是字段
private Integer id;
private String name;
private Date birthday;// 1987-12-10
private Gender gender = Gender.MAN;
private String info;
private Byte[] file;
private String imagepath;
@Transient//在表中就没有对应的字段
public String getImagepath() {
return imagepath;
}
public void setImagepath(String imagepath) {
this.imagepath = imagepath;
}
@Lob//大字段
@Basic(fetch=FetchType.LAZY)//懒加载特性
public Byte[] getFile() {
return file;
}
public void setFile(Byte[] file) {
this.file = file;
}
@Lob
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Enumerated(EnumType.STRING)//枚举类型,可以以数字还是字符串保存的时候
@Column(length = 5, nullable = false)//字段的一些属性
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Temporal(TemporalType.DATE)//日期类型,可以选择Date或者Time
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Person() {
}
public Person(String name) {
this.name = name;
}
@Id//标识主键
@GeneratedValue//自增长,默认为auto
// 属性是由get、set方法来决定的,数据库中字段对应的名称和getId一致,
// 因为d是小写,所以它之前的字母也是小写(第一个字母是否大小写由第二个字母决定)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 10, nullable = false, name = "personName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
调用JPA的API来实现CRUD
@Test
public void save(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
//-->sessionFactory-->session-->begin事务
//在得到sessionFactory的时候,就创建表
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
em.persist(new Person("熊诗言"));
em.getTransaction().commit();
em.close();
factory.close();
}
//查询数据不需要开启事务,只有发生数据更改时才需要开启事务
@Test
public void getPerson(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Person person=em.find(Person.class, 1);//类似get()
// /**
// * 用了一分钟,数据库中的该条数据如果已经被修改,需要用refresh方法去获取最新的数据
// */
// em.refresh(person);
System.out.println(person.getName());
em.close();
factory.close();
}
//find和getReference的区别之一:当数据库没有该记录时,那么find返回的对象是null;
//getReference返回的对象在输出时,会报EntityNotFoundException异常,在执行(2)时报错
@Test
public void getPerson2(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Person person=em.getReference(Person.class, 1);//1
//类似load(),获得的只是代理类cglib
System.out.println(person.getName());//2
em.close();
factory.close();
}
//(事务管理的四种状态)new
//managed 托管
//游离(脱管)
//删除
@Test
public void updatePerson(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
//事务关联,处于托管状态,满足这两个条件时可以直接修改对象属性
person.setName("老张");
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void updatePerson2(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
em.clear();//把实体管理器中的所有实体变成游离状态
person.setName("老王");//这里同步不了
em.merge(person);//把游离状态下的实体bean更新同步回数据库
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void delete(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("itcast");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Person person=em.find(Person.class, 1);
em.remove(person);//只能删除托管状态的,也就是这个对象在我的管理下,数据库中也存在我才能删除
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void query(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
Query query=em.createQuery("select o from Person o where o.id=?1");//问号明确从1开始,也可以o.id=:id
query.setParameter(1, 2);
List<Person> persons=query.getResultList();//query.getSingleResult()
for(Person person:persons)
System.out.println(person.getName());
em.close();
factory.close();
}
@Test
public void deletequery(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Query query=em.createQuery("delete from Person o where o.id=?1");
query.setParameter(1, 2);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void queryupdate(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("unitName");
EntityManager em=factory.createEntityManager();
em.getTransaction().begin();//开始事务
Query query=em.createQuery("update Person o set o.name=:name where o.id=:id");
query.setParameter("name", "xxx");
query.setParameter("id", 3);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
JPA(hibernate)二级缓存配置
第一步:导入ehcache的ehcache.jar文件(hibernate中有)
第二步:在persistence.xml文件中添加下面配置项:
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
第三步:在实体类上面标注@Cache,如:@Cache(region="cn.itcast.bean.Person",usage=CacheConcurrencyStrategy.READ_WRITE)
第四步:在classpath下放入ehcache.xml,内容模版如下:
<?xml version="1.0"encoding="UTF-8"?>
<ehcache>
<diskStore path="D:\cache"/>
<defaultCachemaxElementsInMemory="1000" eternal="false"overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="60"/>
<cache name="cn.itcast.bean.Person"maxElementsInMemory="100" eternal="false"
overflowToDisk="true"timeToIdleSeconds="300"timeToLiveSeconds="600"diskPersistent="false"/>
</ehcache>
注意:<cache>节点中的name属性值要和@Cache(region="cn.itcast.bean.Person")中的region相同
ehcache.xml文件中各项属性说明如下:
defaultCache节点为缺省的缓存策略
maxElementsInMemory内存中最大允许存在的对象数量
eternal
设置缓存中的对象是否永远不过期
overflowToDisk把溢出的对象存放到硬盘上(对于本例而言,第1001个对象将存放在硬盘上)
timeToIdleSeconds指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
timeToLiveSeconds指定缓存对象总的存活时间
diskPersistent当jvm结束是是否持久化对象
diskExpiryThreadIntervalSeconds指定专门用于清除过期对象的监听线程的轮询时间
相关文章推荐
- 第十二周项目2-操作用临界表存储的图
- “南大软院大神养成计划“_第十二天的学习“
- "知原理"检验题目——第13周
- HDU 3667 Transportation 费用流巧妙拆边
- 第十三周上机实践—项目1(2)—Kruskal算法的验证
- 第七周项目2-建立链队算法库
- 与人相加
- Linq 左连接 left join
- 检索
- 第9周实践项目4-广义表算法库及应用
- 第12周 项目3-图遍历算法实现
- Centos6.7 简单搭建dns服务器
- 第13周上机实践项目 - 算法验证(4)Floyd算法验证
- 如何在Visual Studio中开发自己的代码生成器插件
- Android导入项目时Android jar包丢失的解决
- 第9周实践项目3-稀疏矩阵的三元组表示的应用(3.2)
- 第13周 项目1、2- 验证算法
- 男人应该关注的是自己现在有多少钱,不应该关注自己以后有多少钱
- 使用TypeScript拓展你自己的VS Code!
- 第9周实践项目3-稀疏矩阵的三元组表示的实现(3.1)