1. 二级缓存使用
Hibernate提供的缓存分类:
一级缓存
基于sessoin的缓存!
特点:
1. 在短时间内多次操作数据库情况下,缓存效果比较明显!
2. session关闭后,就不能使用缓存内容!
问题:
Session,能否共享一级缓存数据?
不能!
实验:
1. 2个session
2. Dept dept = (Dept)session1.get(..);
dept加入session1的缓存
3. session2.update(dept);
dept 加入session2的缓存
4. dept.setName("new name");
总结:
缓存只在当前session有效,缓存时间短、作用范围小!总体来看缓存效果不明显!
二级缓存:
基于应用程序的缓存、基于sessionFactory级别的缓存!
缓存数据可以被多个session共享! 但需要指定哪些对象要放入二级缓存中!
放入二级缓存中对象的特点:
1. 经常使用
2. 不会被经常修改!
Hibernate提供的二级缓存是以缓存框架形式提供,hibernate提供了二级缓存框架默认的实现; 也支持其他二级缓存框架,如果要更换缓存,只要更换配置中具体的二级缓存框架使用的核心类即可! 可插配的缓存框架!
配置
Hibernate提供的二级缓存配置, hibenrate.properties配置文件
## disable the second-level cache 【二级缓存默认为关闭】
#hibernate.cache.use_second_level_cache false
## enable the query cache 【是否开启查询缓存】
#hibernate.cache.use_query_cache true
## choose a cache implementation 【二级缓存的实现】
#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
二级缓存默认的实现
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
步骤:
1) 开启二级缓存
2) 指定二级缓存具体实现框架
3) 那些类如要加入二级缓存
4) 测试
* 2个session
* session1.get(1); 查询数据库
Session1.get(); (没有发送查询sql)
* session2.get(1); 从一级缓存中获取,没有,再找二级缓存,找到后就返回!
(没有发送查询sql, 说明应用成功!)
缓存策略:
usage="read-write" 二级缓存的数据可以读、写
usage="read-only" 二级缓存的数据只读
usage="nonstrict-read-write" 非严格读取
usage="transactional" 基于事务的策略
集合缓存
查询缓存
List()查询,不会从一级缓存获取? 那二级缓存呢?
? 不会从session缓存获取数据
? 默认不会从二级缓存获取数据,但可以指定从二级缓存获取!
设计实验:
更新数据,会不会通知一级缓存、二级缓存?
不会通知一级缓存,会通知二级缓存!
1. 对象放入session缓存
2. 修改对象
3. 再看一级缓存数据有没有改变!
2. HQL 查询
hql语法基本与数据库查询语法一致!
支持:模糊、条件、分组、筛选、连接等!
HQL查询:
要有一定的sql基础!
3. Criteria 查询
Hibernate提供的面向对象的查询的另外的方式!
更面向对象!
4. SQLQuery 查询
Hibernate除了支持面向对象的查询外,还支持原生态的sql语句查询,在数据库段写好的sql也可以直接在hibernate中执行!
优缺点:
1 . 对于一些比较负责的查询, hql实现不了, 这时候,本地sql查询就可以作为补充!
2. 使用本地sql查询不能跨数据库平台! 一旦更换了数据库,sql语句有可能会更改!
5. Hibernate 对连接池支持
连接池:
开源的连接池组件C3p0!
连接池:
管理连接,提高连接的使用效率!
Hibernate对连接的支持:
查看hibernate.properties
#################################
### Hibernate Connection Pool ###
#################################
hibernate.connection.pool_size 1 hibernate自带的连接池,只有一个连接!
###########################
### C3P0 Connection Pool###hibernate对C3p0连接池的支持
###########################
#hibernate.c3p0.max_size 2
#hibernate.c3p0.min_size 2
#hibernate.c3p0.timeout 5000
#hibernate.c3p0.max_statements 100
#hibernate.c3p0.idle_test_period 3000
#hibernate.c3p0.acquire_increment 2
#hibernate.c3p0.validate false
C3p0连接池驱动类
#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
hibernate项目中使用c3p0连接池:
0. 引入c3p0驱动包
1. 配置c3p0驱动类
2. 连接池参数配置