Hibernate一级缓存详解及优化

【实战技巧】matplotlib中文标签显示问题的3种高效解决方案 本文详细介绍了解决matplotlib中文标签显示问题的3种高效方法,包括修改字体设置、临时指定字体和修改后端配置。针对不同操作系统和环境提供了实用技巧,帮助开发者快速解决中文显示为方框的常见问题,提升数据可视化效果。 阅读详情

1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()
2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;
3.Session缓存是实体级别的缓存 ,就是只有在查询对象级别的时候才使用 ,如果使用HQL和SQL是查询属性级别 的,是不使用一级缓存的!切记!!!!
4.iterate 查询使用缓存,会发出查询Id的SQL和HQL语句,但不会发出查实体的,它查询完会把相应的实体放到缓存里边,一些实体查询如果缓存里边有,就从缓存中查询,但还是会发出查询id的SQL和HQL语句。如果缓存中没有它会数据库中查询,然后将查询到的实体一个一个放到缓存中去,所以会有N+1问题出现。

  每一个Hibernate Session实例和一个数据库事务绑定通常将每一个Hibernate Session实例和一个数据处理库事务绑定就是说,每执行一个数据库事务(操作),都应该先创建一个新的Hibernate Session实例.
如果事务执行中出现异常,应该撤消事务.不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Hibernate Session实例占用的资源.

  如何获得Session对象

首先创建SessionFactory对 象,如果访问多个数据源时,则应该产生多个SessionFactory;
  • 但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源 ,然后根据SessionFactory再创建Session对象
    Session session=factory.openSession();
        Transaction ts =  null ;
        try   {
          ts=session.beginTransaction();  //开始一个事务
          ...................                       //执行事务
          ts.commit();                           //提交事务
        }  catch   (HibernateException e) {      //如果出现异常就撤销事务
          if (ts!=null ){
            ts.rollback();                        //回滚事务
          }
          e.printStackTrace();
        }  finally {
          session.close();//不管事务执行成功与否,最后都关闭Session并且放在finally中以提高安全性
        }
    下面我们重点看一下Session级的缓存
    Hibernate 缓存分为二级,第一级存放于 session 中称为一级缓存,默认带有且不能卸载
    因为 Session 的生命期往往很短,存在于 Session 内部的最快缓存的生命期当然也很短, 所以第一级缓存的命中率是很低的 。其对系统性能的改善也是很有限的。当然,这个 Session 内部缓存的主要作用是保持 Session 内部数据状态同步 。并非是 hibernate 为了大幅提高系统性能所提供的。
    为了提高使用 hibernate 的性能,除了常规的一些需要注意的方法比如: 使用延迟加载、迫切外连接、查询过滤等以外,还需要配置 hibernate 的二级缓存。其对系统整体性能的改善往往具有立竿见影的效果。.
    应用
    Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口list,filter,iterate时,如session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中 ,
    当Session关闭的时候该Session所管理的一级缓存也会立即被清除
    Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置

    一级缓存采用的是key-value的Map方式来实现的,在缓存实体对象时,对象的主关键字ID是Map的key,实体对象就是对应的值。所以说,一级缓存是以实体对象为单位进行存储 的,在访问的时候使用的是主关键字ID
    虽然,Hibernate对一级缓存使用的是自动维护的功能,没有提供任何配置功能,但是可以通过Session中所提供的方法来对一级缓存的管理进行手工干预。Session中所提供的干预方法包括以下两种
    ●evict() :用于将某个对象从Session的一级缓存中清除
    evict()方法适用于以下二种情况:
    1)不需要该对象进行同步的数据更新
    2)在批量进行更新与删除时,当更新删除每一个对象后,要释对此对象所占用的内存.

    ●clear() :用于将一级缓存中的所有对象全部清除。

    在进行大批量数据一次性更新的时候,会占用非常多的内存来缓存被更新的对象。这时就应该阶段性地调用clear()方法来清空一级缓存中的对象,控制一级缓存的大小,以避免产生内存溢出的情况。
    Hibernate大批量更新时缓存的处理方法:
    (假设我们user表的age有5000条大于0的记录,)
    Session session =SessionFactory.openSession();
    Transaction   tx =session.beginTransaction();
    Itertaor users=session.find("from   User   u  where   u.age>0").itertaor();//HSL语句就不做解释了
    while (user .hasNext()){
    User   user   =(User )users.next();
    user .setAge(user .getAge()+1);
    //将本批插入的对象立即写入数据库并释放内存
    session.flush();
    session.clear();
    }
    tx.commit ();
    session.close ();

    用Hibernate处理大批数据时..都必须先执行5000次的update语句,然后才能更新5000个user 对象..
    这样就影响到了操作上的性能....在项目当我们遇到性能与空间的问题时,,,要以性能为主..这也就是说要牺牲空间

    所以程序最好跳过Hibernate API  而直接通过JDBC API来执来...

    我们改一下上面的代码:
    Session session=SessionFactory.openSession();
    Transaction   tx =session.beginTransaction();
    Connection conn =session.connection();
    PreparedStatement    pstmt = conn.prepareStatement("update   users  set   age=age+1 "+"where   age >0");
    pstmt.executeUpdate();
    tx.commit ();

    虽说这是通过JDBC API.但本质上还是通过Hibernater Transaction的事务这个接口来声明事务的边界的...

    其实最好的解决方法就是以创建存储过程,,用底层的数据库运行..这样性能好,速度快....

    我就简单的以Oracle数据库为例子.创建一个名为UserUpdate的存储过程...然后在程序中进行调用...
        
    UserUpdate的存储过程代码:
                                                create   or     replace   procadure UserUpdate(u_age  in   number)  as  
                                                begin
                                                                          update   users  set   age=age+1  where   age>u_age;
                                                    end ;    
      
      下面的是在程序中如何调用我们命名的存储过程 
                         
    Session session =SessionFactory.openSession();
                                             Transaction tx =session.beginTransaction();
                                             Connection conn=session.connection();
                                         String str="{call UserUpdate(?)}" ;
                                         CallableStatement cstmt= conn.prepareCall(str);
                                         cstmt.setInt(1,0);
                                        cstmt.executeUpdate();
                                        tx.commit();

    用JDBC API的好处是这样的..
    它不用把大批量的数据事先加载到内存中,然后再进行更新与修改..所以不会消耗大量内存....
    (小程序中是看不出什么差别的..当数据的记录达到一定的数据量的时候自然会发现用Hibernate API 与JDBC API的差别)
    在一个就是只能一条记录进行批量更新..不像Hibernate中更新每一条的..

手把手教你使用ESM-2进行蛋白质结构预测:从安装到实战 本文详细介绍了如何使用ESM-2蛋白质语言模型进行蛋白质结构预测,从环境准备、模型安装到实战应用。通过逐步指导,读者可以掌握ESM-2的配置、单序列预测、结果可视化及高级优化技巧,适用于生物信息学研究和药物开发。 阅读详情

相关推荐

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

Hibernate的一级缓存

声明: 有一些博文是看的黑马程序员视频,然后跟着老师做的笔记 Spring是跟子路老师学的 特此感谢,写这些文章的目的是为了自己方便查阅

JDS_DIJ的博客 476

cocos2dx中DrawNode画线锯齿和非凸多边形填充

记录一下在cocos2dx中使用DrawNode所遇到的2个问题 1.画线锯齿问题 ios版本下,在AppController.mm中设置CCEAGLView的multiSampling和numberOfSamples。如下图 CCEAGLView *eaglView = [CCEAGLView viewWithFrame: [window bounds]

hello-world 5413

Hibernate 所有缓存机制详解

Hibernate缓存的作用:   Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据   Hibernate缓存分类:   Hibernate缓存包括两大类:Hibernate一级缓存和Hibe

Smal1_Sun的博客 658

论文阅读—Square Attack: a query-efficient black-box adversarial attack via random search

论文阅读—Square Attack: a query-efficient black-box adversarial attack via random search 发表位置 ECCV 2020 摘要 作者提出了一种基于得分的黑盒Square attack,该模型不依赖于模型的局部梯度信息,因此可以绕过梯度隐藏防御攻击。Square Attack是一种随机搜索方法,它在随机位置选择局部的方形更新,使得每次迭代时扰动近似位于可行集的边界。 背景 当涉及到对安全至关重要的机器学习应用时,对抗性的例子尤其值得

yayayamaomaoya的博客 2492

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 353

Hibernate一级缓存详解

1.Session级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()2.两个session不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果使用H...

weixin_34319111的博客 223

Docker离线部署OpenWebUI操作步骤

docker离线部署openwebui

m0_49333265的博客 4346

Hibernate学习笔记(十):一级缓存

项目结构: 实体类 User.java: package com.hibernate.status; import javax.persistence.*; import java.util.Objects; public class User { private int id; private String username; public int get...

秋忆夏伤的博客 265

SAP WM模块事务码(TCODE)大全

OL07 Data transfer stor.bins LDK34->RLPLA 仓储位LDK34 ->RLPLA

matinal 當冬夜漸暖 。公众号:matinal 5845

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1127

applicationContext.xml 配置说明(hibernat+spring )

转载:http://wangqiaowqo.iteye.com/blog/186993

xijunhu1982的专栏 161

STM32CubeIDE下载程序报错:Failed to execute MI command: load G:\\Cube_IDE_EXP\\00_FIRST\\Debug\\00...如何解决??

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2592

Hibernate 基本概念总结

ORM与持久化映射 1.阐述实体对象的三种状态以及转换关系 Hibernate有三种状态,分别是:瞬时态、持久态、游离态、移除态 瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被垃圾回收机制回收。这个对象与数据库没有任何关系。除非通过session的save()等方法把瞬时态对象与数据库做关联,保存到数据库中,这个对象...

qq_41585840的博客 223

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

心得15-hibernate的优化2-缓存(一级、二级)

1.缓存概述     缓存(cache)在java应用程序中是一组内存中的集合实例。它保存着永久性存储源(如硬盘上的文件或者数据库)中数据的备份,它的读写速度比读写硬盘的速度快。应用程序在运行时直接读写缓存中的数据,只在某些特定时刻安排缓存中的数据来同步更新数据存储源。如果缓存中存放的数据量非常大,也会用硬盘作为缓存的物理介质。    缓存的作用就是降低应用程序直接读写永久性数据存储源的频率,

ykblog.github.io 1588

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

浅谈Hibernate缓存机制:一级缓存、二级缓存

浅谈Hibernate缓存机制:一级缓存、二级缓存

VipMao的博客 7228

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Hibernate框架之一级缓存与一级缓存快照

在上一篇博客 Hibernate框架之实体的三种状态 引入了session缓存的概念,下面将介绍一下一级缓存与一级缓存快照。 1、一级缓存 所谓一级缓存,又称为session级别的缓存(就是上一篇博客引入的session缓存)。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(实体类的对象),为程序优化服务,如果之后需要相应的数据,...

hestyle的博客 358

hibernate一级缓存_Hibernate缓存–一级缓存

hibernate一级缓存Welcome to Hibernate Caching – First Level Cache Example Tutorial. Recently we looked into Hibernate architecture, hibernate mapping and how to use HQL for firing SQL queries in object or...

从零开始的教程世界 567

Hibernate的一级缓存Session和二级缓存SessionFactory

Hibernate的一级缓存是指Session,它是一块内存空间,用来存放相互管理的java对象,有了一级缓存,应用程序可以减少访问数据库的次数,提高了性能。在使用Hibernate查询对象的时候,首先会使用对象属性的OID值(对应表中的主键)在Hibernate的一级缓存进行查找,如果找到,则取出返回,不会再查询数据库,如果没有找到,再到数据库中进行查询操作。然后将查询结果存放到Session一级

qq_19925065的博客 1972

Hibernate一级缓存

Hibernate一级缓存 1.缓存 缓存:是一种优化的方式,将数据存入到内存中,使用的时候直接从内存中读取,不用通过***存储源*** ###2.Hibernate 一级缓存 Hibernate提供了优化手段:缓存,抓取…等手段 一级缓存:Session级别的缓存,一级缓存的生命周期与Session一致(一级缓存是由一系列java集合构成,一级缓存是自带的,不可卸载),属于事务级缓冲 ...

mqy224512的博客 203

Hibernate学习之Hibernate的一级缓存

hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式。hibernate的缓存分为一级缓存和二级缓存,这两级缓存都位于持久化层(持久化类即实体类),存储的都是数据库数据的备份。

dawn_1108的博客 310

Hibernate一级缓存,二级缓存

1、Hibernate的一级缓存 在Hibernate框架内部应用缓存提高应用系统的运行性能,Hibernate中的缓存分为为一级和二级缓存。 Hibernate 的一级缓存是内置缓存,不能通过程序代码或者配置人为取消取消,并且一级缓存通过Session对象实现缓存,所以也被为“Session”缓存。一级缓 存是事务级别的缓存,事务结束缓存中的所有数据失效。使用一级缓存可以在一个事务中减少查询

lidiansheng的专栏 1276

10分钟入门Hibernate的一级缓存

Hibernate的一级缓存 10分钟入门Hibernate的一级缓存,缓存的概念,证明Hibernate的一级缓存的存在,一级缓存的内部结构,一级缓存中特殊的区域:快照区,一级缓存中的管理

程序员猫爪 591

Hibernate中的一级缓存机制

Hibernate中的一级缓存 1、什么是缓存? 缓存是一种优化的方式,将数据存入内存中,使用的时候直接从缓存中获取,不用通过存储源。 2、Hibernate框架中提供了很多优化手段:缓存、抓取策略。 Hibernate中提供了2种缓存机制:一级缓存、二级缓存。 一级缓存是Session级别的,自带的。 二级缓存是SessionFactory级别的,需要手动去配置。 3、什么是Hibernate的一级缓存? Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放

pipizhen_的博客 457
上一篇: Hibernate中对象状态
下一篇: Hibernate二级缓存详解
北斗安心联
博客等级 码龄16年 6粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值