缓存
1.什么是缓存???
缓存就是介于应用程序和磁盘之间的一个存储区域
这就是存储区域就是内存
2.为什么使用缓存
减少了对数据库的访问次数,能够提高查询的效率
3.使用缓存的优缺点
优点:获取数据效率比较块
缺点: 数据不能及时同步,内存消耗表较大
4.如何使用缓存(hibernate中缓存的分类)
一级缓存(session缓存):默认使用的缓存
当从数据库中查询了数据之后,会将数据存放到一级缓存中,如果下一次需要获取相同的数据时,不会再次查询数据库,而是直接从缓存中获取数据
清空缓存:
evict(对象) --清空缓存中指定的对象数据
clear()--清空缓存中所有的对象数据
close()--先清空缓存在关闭session
二级缓存 (sessionFactory) : 内部提供二级缓存接口
特点: 和session对象没有关系(session是否关闭 对二级缓存无影响)
对外只读,不能写入
需要第三方:
1.下载第三方的缓存插件(OSCache EHCahed等)
2.引入缓存插件到项目中 在src目录下引入ehcache.xml缓存配置文件
3.ehcache -core -2.4.6.jar commons - logging -
配置ehcache
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!--
缓存配置 name:缓存名称。 maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。 diskPersistent:是否缓存虚拟机重启期数据 Whether the
disk store persists between restarts of the Virtual Machine. The
default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
<diskStore path="java.io.tmpdir" />
<!-- 默认的缓存设置 -->
<defaultCache maxElementsInMemory="500" eternal="false"
timeToIdleSeconds="300" timeToLiveSeconds="1200" overflowToDisk="true" />
<!-- 自定义缓存配置 -->
<cache name="com.direct.entity.Empinfo" maxElementsInMemory="500" eternal="false"
timeToIdleSeconds="2" timeToLiveSeconds="1200" overflowToDisk="true"></cache>
</ehcache>
配置hibernate.cfg.xml
<!-- 启用二级缓存 -->
<property name="hibernate.cache.second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 使用二级缓存 方法1 -->
<class-cache usage="read-only" class="全路径"/>
配置hbm.xml
位置在class下面
<!-- 使用二级缓存 方法2 -->
<cache usage="read-write" />
测试
@Test
public void T() {
//创建configuration 对象,加载资源
Configuration conf=new Configuration().configure();
//创建SessionFactory 工厂对象,加载执行
SessionFactory factory=conf.buildSessionFactory();
Session session=factory.openSession();
Transaction ts=session.beginTransaction();//开启事务
//从数据库中取值
EmpInfo emp=(EmpInfo)session.get(EmpInfo.class, 2);
System.out.println(emp);
ts.commit();
System.out.println("========================");
EmpInfo emp2=(EmpInfo)session.get(EmpInfo.class, 2);
System.out.println(emp2);
System.out.println("========================");
Session session2=factory.openSession();
Transaction ts2=session.beginTransaction();//开启事务
EmpInfo emp3=( EmpInfo)session2.get( EmpInfo.class, 2);
System.out.println(emp3);
ts2.commit();
System.out.println("=========================");
}
}
JPA
1.什么是JPA
是由sun公司提供的一套用于java持久化操作规范
2.为什么要使用JPA
简化现有的持久化开发流程 整合现有的ORM对象关系映射框架
3.如何使用JPA
步骤: 在src 创建目录 META-INF 用于存放JPA的配置文件 persistence.xml 用于配置数据库连接信息
创建实体管理工厂对象 (类似于hibernate 中的sessionfactory对象)
注解
@entity ---------实体类注解
@table ---------数据表注解 name="表名" catalog="数据库名称"
@Id --------配置主键
@GrenertedValue --------主键生成器
@column --------指定主键字段
@column -------指定一般字段
@OneToMany(fetch=FetchType.LAZY,mappedBy="deptinfo") ---懒加载
@OneToMany(fetch=FetchType.EAGER,mappedBy="deptinfo") ---即时加载
注意:@OneToMany(fetch=FetchType.EAGER,mappedBy="外键字段对应的实体类的属性名")
@Joincolmumn(name = "")
merge---> 修改
remove ---> 删除