夜光带你走进Hibernate(九)

夜光序言:

 

喜欢三月的风,四月的雨,不落的太阳和爱笑的你

 

正文:

1. 二级缓存使用

Hibernate提供的缓存分类:

一级缓存

基于sessoin的缓存

特点:

1. 在短时间内多次操作数据库情况下,缓存效果比较明显

2. session关闭后,就不能使用缓存内容

面试题:

不能的Session,能否共享一级缓存数据

不能

 

夜光:实验

 

  1. 2session

  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提供的面向对象的查询的另外的方式~

更面向对象~

 

3. SQLQuery 查询

Hibernate除了支持面向对象的查询外,还支持原生态的sql语句查询,在数据库段写好的sql也可以直接在hibernate中执行~

优缺点:

1 .  对于一些比较负责的查询, hql实现不了, 这时候,本地sql查询就可以作为补充~

2.   使用本地sql查询不能跨数据库平台~ 一旦更换了数据库,sql语句有可能会更改~ 

 

 

4. 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. 连接池参数配置

 

 

 

 

5. 用户库/MyEclipse对hibernate的支持

MyEclipse支持以用户库来管理jar文件~

 

 

6. 创建Session的两种方式

 

// 夜光:2种方式创建session

@Test

public void testSession() throws Exception {

System.out.println(sf);

// 方式1: sf.openSession()  每次都创建一个新的session~

Session session1 = sf.openSession();

Session session2 = sf.openSession();

System.out.println(session1 == session2);  // false

session1.close();

session2.close();

 

// 方式2: 线程的方式创建session

// getCurrentSession() 先从当前线程获取session,没有获取到,就创建新的session

// 创建完成后,再绑定到当前线程~

Session session3 = sf.getCurrentSession();

Session session4 = sf.getCurrentSession();

System.out.println(session3 == session4);  // true

session3.close();

//session4.close(); // 不能重复关闭

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值