.Net转Java自学之路—Hibernate框架篇四(缓存简述、Log4j)
二级缓存:
Hibernate底层连接池提供了类为DriverManagerConnection,DirverManager就是hibernate实现的连接池。使用的代码就是DriverManager.getConnection(url,uname,pwd);因为封装的连接池的性能一般,所以要更好的性能体现,需要整合C3P0连接池。
1、整合C3P0连接池:在核心配置文件中添加配置:导入hibernate所提供的c3p0 jar包 c3pp0-0.9.1.jar
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
2、设置隔离级别
<property name="connection.isolation">4</property>
》Hibernate对隔离级别的描述:
read uncommitted 读未提交 1
read committed 读已提交 2
repeatable read 可重复读 4
serializable 串行化 8
3、管理Session:
Hibernate提供了三种Session管理:
》jta:Session对象的生命周期与JTA事物绑定。
》managed:Hibernate委托程序来管理Session对象的生命周期。
》thread:Session对象的生命周期与本地线程绑定。底层使用ThreadLocal本地线程变量。
将Session交予本地线程 配置核心文件:配置值为thread的好处:就可以使用sessionFactory.getCurrentSession();从本地线程中获取session。
<property name="hibernate.current_session_context_class">thread</property>
缓存:介于应用程序与物理存储数据介质之间。缓存的物理介质就是内存。
hibernate中提供了俩个级别的缓存:
一级缓存是Session级别的缓存。
二级缓存是SessionFactory级别的缓存。二级缓存是Hibernate的一个缓存插件,默认情况不使用,需要提供相应的插件(jar包)才可使用。
二级缓存并发访问策略:
transactional事务型:缓存支持事物,发生异常的适合,缓存也能够回滚。
read-write读写型:更新缓存的适合会锁定缓存中的数据。
nonstrict-read-write非严格读写型:不锁定缓存中的数据。
read-only 只读型:从来不进行修改操作。
二级缓存提供商:
可作为进程范围内的缓存:
EHCashe:存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
OpenSymphony:存放数据的物理介质可以是内存或硬盘。
可作为集群范围内的缓存:
SwarmCache:不支持Hibernate的查询缓存。
JBossCache:可作为集群范围内的缓存。
二级缓存配置:EHCashe
1、导入jar包:核心jar:ehcashe-X.X.X.jar 依赖jar:backport-util-concurrent-X.X.jar、commons.logging.jar
2、配置hibernate来使用缓存:
》开启缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
》设置提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3、执行需要缓存对象 默认都不缓存。
》在实体类配置文件中配置。类级别:<class><cache> 集合级别:<set><cache>
》在核心配置文件中配置。
》》类级别:
<!--配置需要缓存的对象:缓存类--> <class-cache class="cn.test.entity.User" usage="read-write"></class-cache>
》》集合级别:
<!--缓存集合--> <collection-cache collection="cn.test.entity.User.role" usage="read-only"></collection-cache>
4、添加ehcache配置文件。
在ehcache.jar包中复制 ehcache-failsafe.xml并改名为 ehcache.xml,将文件添加到src中。
二级缓存区域:
类缓存:只缓存数据,不缓存对象。
集合缓存:只缓存OID值。默认情况,类和集合都是从二级缓存中获取。
时间戳:executeUpdate() 不会更新类缓存,但时间戳区域将记录更新时间。若使用数据,比较时间,符合条件将执行查询。
查询缓存:又称为Hibernate的三级缓存。以HQL语句为key,进行数据的查询。Query对象,将查询数据缓存二级缓存,但执行不从二级缓存获取。
查询缓存使Query对象固定HQL语句可以使用缓存:
1、启用查询缓存:在核心配置文件中配置:
<property name="hibernate.cache.use_query_cache">true</property>
2、通过Query对象使用缓存。
Query query=session.createQuery("from OnlyClass"); query.setCacheable(true);//将查询结果放置到缓存 Query query1=session1.createQuery("from OnlyClass"); query1.setCacheable(true);//从缓存中获取数据。
二级缓存ehcache配置文件:
<diskStore :设置缓存目录。默认值:java.io.tmpdir 临时目录。内存缓存过多时,将缓存写入到指定目录中。
<defaultCache :设置缓存的默认数据过期策略。
maxElementsInMemory="10000" 设置基于内存的缓存中可存放数据的最大数。
eternal="false" 设置对象是否持久。true表示永不过期。永久性驻留内存。
timeToIdleSeconds="120" 设置对象的最大空闲时间,秒为单位。
timeToLiveSeconds="120" 设置对象的最大生存时间。
overflowToDisk="true" 是否把溢出的对象写入到硬盘中,进行缓存。
maxElementsOnDisk="10000000" 硬盘中最大缓存个数。
diskPersistent="false" 当jvm结束时是否持久化对象。
diskExpiryThreadIntervalSeconds="120" 指定专门用于清理过期对象的监听线程的轮询时间。
memoryStroeEvictionPolicy="LRU" 当内存缓存达到最大,有新的element加入时,移除缓存中element的策略。
》LRU:最近最少使用。默认值 least recently used
》LFU:最不常使用。less frequently used
》FIFO:先进先出。frist in first out
<cache :设定具体的命名缓存的数据过期策略。
提供了name属性,指定需要缓存的对象具体位置。
每个命名缓存代表一个缓存区域,每个缓存区域右各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置过期时间策略。
Log4j:
apache的commons组件一个成员commons-longging-1.1.1.jar,比较简单的日志记录工具包。
apache提供了更强大的日志记录工具:log4j
日志己备:有高到低,六个级别:fatal 致命、error 错误、warn 警告、info 信息、debug 调式、trace 栈
设置级别:fatal 致命、error 错误、warn 警告、info 信息、debug 调式、trace 栈、off 关闭、all 所有
Logger记录器提供了相应的方法对应不同的日志级别:
void fatal(String); void error(String); void warn(String); void info(String); void debug(String); void trace(String); //注:日志输出当前级别,以及更高级别的信息。
配置文件:
位置:src下
文件名称:log4j.properties
内容:Log4j有三个主要部分
记录器Loggers:设置级别与输出源。
格式:log4j.rootLogger=输出级别,输出源1,输出源2...
输出源Appenders:确定输出位置。
格式:log4j.appender.源名称=具体的实现类(log4j提供的)
实现类:
org.apache.log4j.FileAppender 将日志输出到指定文件中
> org.apache.log4j.DailyRollingFileAppender 将日志输出到指定的文件中
> org.apache.log4j.RollingFileAppender 文件到达指定大小时禅城一个新文件
org.apache.log4j.ConsoleAppender 将日志输出到控制台
布局Layouts:确定输出格式。
log4j.appender.stdout.target 输出方式(System.out | System.err)
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 输出格式布局
log4j.appender.stdout.layout.ConVersionPattern = 输出格式
Hibernate继承log4j:导入log4j.jar;拷贝log4j配置文件;Hibernate使用slf4j-apip-1.x.x.jar进行日志的记录。