hibernate 的cache管理(摘自云之南)

本文详细介绍了Hibernate中的缓存管理机制,包括一级缓存和二级缓存的工作原理及配置方法。探讨了如何利用缓存提高数据读取性能,并讨论了不同缓存策略的选择及其应用场景。
hibernate 的cache管理(摘自云之南)
Cache 就是缓存,它往往是提高系统性能的最重要手段,对数据起到一个蓄水池和缓冲的作用。Cache对于大量依赖数据读取操作的系统而言尤其重要。在大并发量的 情况下,如果每次程序都需要向数据库直接做查询操作,它们所带来的性能开销是显而易见的,频繁的网络舆,数据库磁盘的读写操作都会大大降低系统的性能。此 时如果能让数据库在本地内存中保留一个镜像,下次访问的时候只需要从内存中直接获取,那么显然可以带来不小的性能提升。引入Cache机制的难点是如何保 证内存中数据的有效性,否则脏数据的出现将会给系统带来难以预知的严重后果。虽然一个设计得很好的应用程序不用Cache也可以表现出让人接受的性能,但 毫无疑问,一些对读取操作要求比较高的应用程序可以通过Cache获得更高的性能。对于应用程序,Cache通过内存或磁盘保存了数据库中的当前有关数据 状态,它是一个存储在本地的数据备份。Cache位于数据库和应用程序之间,从数据库更新数据,并给程序提供数据。
Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。Hibernate中的Cache可分为两层:一级Cache和二级Cache。
一级Cache:
Session实现了第一级Cache,它属于事务级数据缓冲。一旦事务结束,这个Cache也随之失效。一个Session的生命周期对应一个数据库事务或一个程序事务。
Session-cache保证了一个Session中两次请求同一个对象时,取得的对象是同一个JAVA实例,有时它可以避免不必要的数据冲突。另外,它还能为另一些重要的性能提供保证:
1:在对一个对象进行自我循环引用时, 不至于产生堆栈溢出。
2:当数据库事务结束时,对于同一个数据库行,不会产生数据冲突,因为对于数据库中的一行,最多只有一个对象来表示它。
3:一个事务中可能会有很多个处理单元,在每一个处理单元中做的操作都会立即被另外的处理单元得知。
我 们不用刻意去打开Session-cache,它总是被打开并且不能被关闭。当使用save(),update()或saveOrUpdate()来保存 数据更改,或通过load(),find(),list()等方法来得到对象时,对象就会被加入到Session-cache。
如果要同步很多数据对象,就需要有效地管理Cache,可以用Session的evict()方法从一级Cache中移除对象。如下:
Session session = HibernateUtil.currentSession();
Transaction tx 
= session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
    Student stu 
= new Student();
    
    session.save(stu);
}

tx.commit();
session.close();
在 保存50000个或更多对象时,程序可能会抛出OutOfMemoryException异常,因为Hibernate在一级Cache缓存了新加入的所 有对象。内存溢出。要解决这全问题就需要把JDBC批处理数量设置为一个合理的数值(一般是10~20)。在Hibernate的配置文件中可以加入以下 属性
<property name="hibernate.jdbc.batch_size"> 20 </property>

然后我们在程序中一定时刻就提交并更新Session的Cache:
Session session = HibernateUtil.currentSession();
Transaction tx 
= session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
    Student stu 
= new Student();
    
    session.save(stu);
    
if(i%20 == 0)    //每保存完20个对象后,进行如下操作
    {
        session.flush();
//这个会提交更新
        session.clear();//清除Cache,释放内存
    }
}

tx.commit();
session.close();

二级Cache
二 级Cache是SessionFactory范围内的缓存,所有的Session共享同一个二级Cache。在二级Cache中保存持久性实例的散装形式 的数据。二级Cache的内部如何实现并不重要,重要的是采用哪种正确的缓存策略,以及采用哪个Cache提供器。持久化不同的数据需要不同的Cache 策略,比如一些因素将影响到Cache策略的选择:数据的读/写比例,数据表是否能被其他的应用程序扬访问等。对于一些读/写比例高的数据可以打开它的缓 存,允许这些数据进入二级缓存容器有利于系统性能的优化;而对于能被其它应用程序访问的数据对象,最好将此对象的二级Cache选项关闭。
设置Hibernate的二级Cache需要分两步进行:首先确认使用什么数据并发策略,然后配置缓存过期时间并设置Cache提供器。
有4种内置的Hibernate数据并发冲突策略,代表数据库隔离级别,如下:
1:事务(Transaction)仅在受管理的环境中可用。它保证可重读的事务隔离级别,可以对读/写比例高,很少更新的数据采用该策略。
2:读写(read-write)使用时间戳机制维护读写提交事务隔离级别。可以对读/写比例高,很少更新的数据采用该策略。
3:非严格读写(notstrict-read-write)不保证Cache和数据库之间的数据库的一致性。使用此策略时,应该设置足够的缓存过期时间,否则可能从缓存中读出脏数据。当一些数据极少改变,并且当这些数据和数据库有一部份不量影响不大时,可以使用此策略。
4:只读(read-only)当确保数据永不改变时,可以使用此策略。

我们确定了Cache策略后,就要挑选一个高效的Cache提供器,它将作为插件被Hibernate调用。Hibernate允许使用下述几种缓存插件:
EhCache:可以在JVM中作为一个简单进程范围内的缓存,它可以把缓存的数据放入内存或磁盘,并支持Hibernate中可选用的查询缓存。
OpenSymphony OSCache:和EhCache相似,并且提供了丰富的缓存过期策略。
SwarmCache:可作为集群范围的缓存,但不支持查询缓存。
JBossCache:可作为集群范围的缓冲,但不支持查询缓存。

在Hibernate中使用EhCache
EhCache是一个纯JAVA程序,可以在Hibernate中作为一个插件引入。在Hibernate中使用EhCache需要在Hibernate的配置文件中设置如下:

<propery name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</property>
EhCacheProvider 类是位于Hibernate3.jar包中而不是ehcache-1.1.jar包中。EhCache有自己的配置文档,名为chcache.xml。 Hibernate3.x中的etc目录下有ehcache.xml的示例文件,只须要将 它COPY到我们的应用程序src目录下(编译时会把ehcache.xmlCOPY到WEB-INF/classes目录下)。对其中的相关值进行更改 以和自己的程序相适应。进行配置后,在ehcache.xml文件中的代码如下:
<ehcache>
    
<diskStore path="c:\\cache"/>    //设置cache.data文件存放位置

    
<defaultCache
                
maxElementsInMemory="10000" //缓存中允许创建的最大对象数
                eternal
="false"    //缓存中对象是否为永久的
                timeToIdleSeconds
="120"//缓存数据钝化时间(即对象在它过期前的空闲时间)
                timeToLiveSeconds
="120"//缓存数据生存时间(即对象在它过期前的生存时间)
                overflowToDisk
="true"
    
/>
    
    
<cache name="Student"    //用户自定义的Cache配置
                 maxElementsInMemory
="10000"
                 eternal
="false"
                 timeToIdleSeconds
="300"
                 timeToLiveSeconds
="600"
                 overflowToDisk
="true"
                 
/>
</ehcache>
此外我们还需要在持久化类的映射文件中进行配置。例如,Group(班级)和Student(学生)是一对多的关系,它们对应的数据表分别是t_group和t_student。现在要把Student类的数据进行二级缓存,这需要在二个映射文件中都对二级缓存进行配置。
在Group.hbm.xml中如下
在其<set></set>中添加
<cache usage="read-write"/><!--集合中的数据被缓存-->
上述文件虽然在<set>标记中设置了<cache usage="read-write"/>,但Hibernate只是把Group相关的Student的主键ID加入到缓存中,如果希望把整个Student的散装属性都加入到二级缓存中,还需要在Student.hbm.xml文件的<class>标记中添加<cache>子标记。如下:
<class name="Student" table="t_student">
    
<cache usage="read-write" /><!--cache标记需跟在class标记后-->
</class>
输出的不有序///////img3m7.ddimg.cn/27/35/29299077-1_b_6.jpg 退烧(全二册)舒虞浪漫新作 ¥30.40 //img3m5.ddimg.cn/20/2/29580725-1_b_1710384827.jpg 与岁长宁 上册 追光救赎 高口碑古言 嫁反派 娇娇贵女x乖张美强惨 反派 男主 她是他心尖上的善念 是刻在他伤痕上的名字 ¥24.00 //img3m9.ddimg.cn/61/15/29803219-1_b_1741153031.jpg 渡夏天 ¥19.30 2025-12-13 17:36:45 [scrapy.core.scraper] DEBUG: Scraped from <200 https://category.dangdang.com/cp01.01.02.00.00.00.html> {'name': ' 他在云之南 特签版+独家定制海报 景行高人气经典口碑力作 相遇十年典藏版 新增万字番外+作者前言', 'price': '¥29.90', 'src': '//img3m7.ddimg.cn/57/30/29893107-1_b_1753157169.jpg'} 2025-12-13 17:36:45 [scrapy.core.scraper] DEBUG: Scraped from <200 https://category.dangdang.com/cp01.01.02.00.00.00.html> {'name': ' 青:陪安东尼度过漫长岁月5', 'price': '¥24.00', 'src': '//img3m4.ddimg.cn/8/35/29381624-1_b_14.jpg'} 2025-12-13 17:36:45 [scrapy.core.scraper] DEBUG: Scraped from <200 https://category.dangdang.com/cp01.01.02.00.00.00.html> {'name': ' 难哄 2册全集 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇', 'price': '¥66.00', 'src': '//img3m2.ddimg.cn/79/3/29739382-1_b_1739354087.jpg'} //img3m7.ddimg.cn/98/18/12100011857-1_b_1697707435.jpg 扶华合集 ¥ =============================================== =============================================== =============================================== =============================================== =============================================== 2025-12-13 17:36:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://category.dangdang.com/cp01.01.02.00.00.00.html> {'name': ' 神之陨落2 限量亲签 网络名《杀穿副本后,我在规则里养大邪神》番茄小说人气作者白桃呜呜龙无限流大作', 'price': '¥29.90', 'src': '//img3m9.ddimg.cn/35/10/29930309-1_b_1763543697.jpg'}
12-14
先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
2026最新微信在线AI客服系统源码 微信客服AI系统是一款基于PHP开发的智能客服解决方案,完美集成企业微信客服,为企业提供7×24小时智能客服服务。系统支持文本对话、图片分析、视频分析等多种交互方式,并具备完善的对话管理、人工转接、咨询提醒等高级功能。 核心功能 ### 1.  智能AI客服 #### 自动回复 - **上下文理解**:系统自动保存用户对话历史,AI能够理解上下文,提供连贯的对话体验 - **个性化配置**:可自定义系统提示词、最大输出长度等AI参数 #### 产品知识库集成 - **公司信息**:支持配置公司简介、官网、竞争对手等信息 - **产品列表**:可添加多个产品,包括产品名称、配置、价格、适用人群、特点等 - **常见问题FAQ**:预设常见问题及答案,AI优先使用知识库内容回答 - **促销活动**:支持配置当前优惠活动,AI会自动向用户推荐 ### 2. 多媒体支持 #### 图片分析 - 支持用户发送图片,AI自动分析图片内容 - 可结合文字描述,提供更精准的分析结果 - 支持常见图片格式:JPG、PNG、GIF、WebP等 #### 视频分析 - 支持用户发送视频,AI自动分析视频内容 - 视频文件自动保存到服务器,提供公网访问 - 支持常见视频格式:MP4、等 ### 3.  人工客服转接 #### 关键词触发 - **自定义关键词**:可配置多个转人工触发关键词(如:人工、客服、转人工等) - **自动转接**:用户消息包含关键词时,自动转接给指定人工客服 - **友好提示**:转接前向用户发送提示消息,提升用户体验 #### 一键介入功能 - **后台管理**:管理员可在对话管理页面查看所有对话记录 - **快速转接**:点击"一键介入"按钮,立即将用户转接给人工客服
全桥LLC谐振变换器,电压电流双环竞争控制策略带说明文档内容概要:本文档主要围绕全桥LLC谐振变换器展开,重点介绍了一种电压电流双环竞争控制策略,并提供了详细的说明文档。该策略结合了拓展移相EPS方法,旨在优化电流应力并支持正反向运行,适用于双有源桥DC-DC变换器的控制。文中通过Simulink进行仿真研究,验证了控制策略的有效性,并利用PLECS工具进行了损耗计算和开环热仿真,确保系统在实际应用中的可靠性和效率。此外,文档还涵盖了DCDC双机并联系统的热管理问题,展示了完整的建模、仿真与分析流程。; 适合人群:具备电力电子、自动化或电气工程背景,熟悉MATLAB/Simulink和PLECS仿真工具,从事电源变换器设计与控制研究的研发人员及高校研究生。; 使用场景及目标:①用于高性能DC-DC变换器的设计与优化,特别是在新能源、电动汽车、储能系统等需要高效能电源转换的场合;②为研究人员提供电压电流双闭环控制、移相控制策略、损耗分析与热仿真的一体化解决方案,提升系统效率与稳定性;③支持正反向功率流动的应用场景,如能量回馈系统。; 阅读建议:建议读者结合Simulink与PLECS仿真模型同步学习,重点关注控制策略的实现逻辑、参数整定方法及热仿真设置,动手复现仿真案例以深入理解系统动态特性与工程实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值