hibernate的核心api就是hibernatesession,这个session是从factorysession获取的,他控制着hibernate的所有
持久化的操作
hibernate的缓存是分为两级的,以及缓存是一个事务缓存,是必须使用的,测试用例就是在一个事务查询两次
同一个语句,只会打印出一次sql语句,这个的前提是必须是同一个sql,包括参数,格式,多一个空格都是不行的
这里深入了解一下,hibernate到底是怎么控制一级缓存的
很多文章都没有深入去讲解到底是怎么控制一级缓存的,但是都提到的一个关键词,就是插件,一级缓存和二级
缓存都是一个插件,所以,我理解的控制原理应该是这样,这个插件应该是使用C语言进行编写的,因为C语言毕竟
是和硬件交互最好的语言,以查询为例,他会将你的查询语句和查询结构都放在放在使用C语言开辟的内存中,
当你使用同样的查询语句时,他就会去匹配在缓存中被标记的语句,如果匹配不到,就去数据库查询,匹配到,
就将结果返回给你
二级缓存,这个缓存需要手动开启,他主要是为了提供事务之间的缓存访问,那么随之而来的问题就是一个并发
的问题,所以,hibernate提供了四种缓存策略,当然,这四种策略肯定都有对应的实现,只要加入对应的jar包
就行了,这四种策略就是,事务型,就是只能有一个事务来访问我的缓存,其实这种感觉没有解决并发的问题,
多个事务或则线程同时访问的时候是需要排队的,读写型,这种就是支持并发了,但是你肯定就会读取的到脏数据,
比如一个更新,一个查询,我这更新还没有完成,你就查出来了,那就不是最新的数据,非严格读写型,就是比上一个
更好的饿实现并发,但是读取到脏数据的可能性就大了,第四个就是只读型,这种就是只能是读取数据,但是所有人
都能读,最大程度的是实现了并发,
二级缓存提供了两种访问策略,一个是更具id查询,一个是根据query查询,第一个就是根据你的条件把所有字段
进行缓存,如果你通过id再次查询,就一查一个准, 但是你给他其他的条件查询,就软蛋了,这就要用到另外一种
查询策略,不能叫他一直这么软蛋啊,那就是将你的查询语句和条件生成一个key,然后和查询出的数据关联,如果
再次传入相同的语句,就一查一个准,这个和我猜测的一级缓存的查询策略是一致的,所以,hibernate自己实现了
一套用查询语句和条件生成key的算法.
持久化的操作
hibernate的缓存是分为两级的,以及缓存是一个事务缓存,是必须使用的,测试用例就是在一个事务查询两次
同一个语句,只会打印出一次sql语句,这个的前提是必须是同一个sql,包括参数,格式,多一个空格都是不行的
这里深入了解一下,hibernate到底是怎么控制一级缓存的
很多文章都没有深入去讲解到底是怎么控制一级缓存的,但是都提到的一个关键词,就是插件,一级缓存和二级
缓存都是一个插件,所以,我理解的控制原理应该是这样,这个插件应该是使用C语言进行编写的,因为C语言毕竟
是和硬件交互最好的语言,以查询为例,他会将你的查询语句和查询结构都放在放在使用C语言开辟的内存中,
当你使用同样的查询语句时,他就会去匹配在缓存中被标记的语句,如果匹配不到,就去数据库查询,匹配到,
就将结果返回给你
二级缓存,这个缓存需要手动开启,他主要是为了提供事务之间的缓存访问,那么随之而来的问题就是一个并发
的问题,所以,hibernate提供了四种缓存策略,当然,这四种策略肯定都有对应的实现,只要加入对应的jar包
就行了,这四种策略就是,事务型,就是只能有一个事务来访问我的缓存,其实这种感觉没有解决并发的问题,
多个事务或则线程同时访问的时候是需要排队的,读写型,这种就是支持并发了,但是你肯定就会读取的到脏数据,
比如一个更新,一个查询,我这更新还没有完成,你就查出来了,那就不是最新的数据,非严格读写型,就是比上一个
更好的饿实现并发,但是读取到脏数据的可能性就大了,第四个就是只读型,这种就是只能是读取数据,但是所有人
都能读,最大程度的是实现了并发,
二级缓存提供了两种访问策略,一个是更具id查询,一个是根据query查询,第一个就是根据你的条件把所有字段
进行缓存,如果你通过id再次查询,就一查一个准, 但是你给他其他的条件查询,就软蛋了,这就要用到另外一种
查询策略,不能叫他一直这么软蛋啊,那就是将你的查询语句和条件生成一个key,然后和查询出的数据关联,如果
再次传入相同的语句,就一查一个准,这个和我猜测的一级缓存的查询策略是一致的,所以,hibernate自己实现了
一套用查询语句和条件生成key的算法.