分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

hibernate学习 六 Hibernate缓存

发布时间:2023-09-06 01:47责任编辑:顾先生关键词:缓存Hibernate

缓存

   如果在集群环境下使用Hibernate时,(集群有节点A ,节点B) 当请求,发往A节点,A在数据库中修改了一条记录,然后节点B的缓存中如何实时的更新节点A修改的新数据
         hibernate本身的一级缓存不能跨越进程, 需要第三方缓存的支持, Ehcache缓存就可以实现

Hibernate缓存:
?????????  一级缓存:
       在同一个Session里面,第一次调用get()方法, Hibernate先检索缓存中是否有该查找对象,发现没有,Hibernate发送SELECT语句到数据库中取出相应的对象,然后将该对象放入缓存中,以便下次使用,第二次调用get()方法,Hibernate先检索缓存中是否有该查找对象,发现正好有该查找对象,就从缓存中取出来,不再去数据库中检索,没有再次发送select语句。
??一个session不能取另一个session中的缓存。
?二级缓存:
??????SessionFactory级别的缓存,可以跨越Session存在,可以被多个Session所共享。
??(1)经常被访问

??(2)改动不大

??(3)数量有限

??(4)不是很重要的数据,允许出现偶尔并发的数据。
??????????????用户的权限:用户的数量不大,权限不多,不会经常被改动,经常被访问。例如组织机构。 ??
??????????
???Hibernate查找对象如何应用缓存?
????????????  当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;

????????????  查不到,如果配置了二级缓存,那么从二级缓存中查;

????????????  如果都查不到,再查询数据库,把结果按照ID放入到缓存, ?删除、更新、增加数据的时候,同时更新缓存。

QBC(Query By Criteria) API提供了检索对象的另一种方式,:


???Hibernate取部分字段?
  QBC是HQL更上层的封装,会查询所有字段。要想只使用部分字段,需要像写SQL一样写HQL。
  一种方案是:给实体类再加一个构造函数,构造函数只有必须的字段,这样就不会全查( ?String hql=”select new Employee(e.id,e.name_cn) from Employee e”; )
  另外一种是直接写SQL,得到的东西再组装成对象。Query query = getSession().createQuery(hql).setResultTransformer((Transformers.aliasToBean(clazz)));
  DetachedCriteria的投影方式可以取得部分字段。
????
hibernate多表联合查询? ?
????  HQL:配置关系的话,可以不用join; 不配关系的话,HQL中写join; ?
????  QBC的话,用createCriteria可以实现多表关联。Criteria repA=cri.createCriteria("repAward", CriteriaSpecification.LEFT_JOIN);
????????????????????????????????  Criteria works=cri.createCriteria("works", CriteriaSpecification.LEFT_JOIN);

HIbernate session 与 connection关系?

  • session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
  • 多个session与一个connection绑定,底层操作数据库的时会进行同步。
  • 如果某个connection正在被某个session占用, open一个session,则创建一个新的connection与之对应。
  • 有连接池的情况下,session关闭后,connection不一定关闭, 还可以查询到应用占用的连接,若超过最大空闲时间,被连接池回收释放。
  • 有连接池的情况下,session使用完后不关闭,该connection被占用,若超过连接回收时间,也可被连接池回收释放。
  • 非连接池情况下,一个session占用一个connection,若不关闭,该connection无法释放。
  • 每个open的session都需要close。

连接池是多个端口吗?

  套接字是计算机网络中应用层和传输层之间的接口。如果应用程序需要使用网络功能,只需要调用套接字API即可。每个进程可以使用多个套接字,每个套接字都有一个标识符。对于TCP套接字,其标识符结构为:源IP,源端口,目的IP和目的端口。对于客户服务器架构的网络程序,服务器进程的端口是周知的,例如MySQL5543,而客户进程端口是随机分配的。也就是说,每个数据库连接对象,和数据库服务器通信都依赖于它自己的套接字,而这个套接字的端口号是各不相同的,尽管同属于一个进程。

hibernate学习 六 Hibernate缓存

原文地址:https://www.cnblogs.com/liufei1983/p/8667289.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved