- 浏览: 430749 次
- 性别:
- 来自: 云南
-
文章分类
- 全部博客 (143)
- zk (22)
- jpbm (1)
- cas (4)
- sql (18)
- Hibernate (21)
- Elcipse (7)
- Android (1)
- 综合 (11)
- tomcat (6)
- WebService (3)
- js (4)
- weblogic (2)
- Spring (10)
- ubuntu (3)
- os (2)
- JSTL (2)
- java (10)
- css (3)
- cloud (1)
- shiro (2)
- jacob (3)
- junit (1)
- testng (3)
- 办公应用 (1)
- maven (2)
- oracle (1)
- ckplayer (1)
- 正则表达式 (1)
- poi (1)
- html (1)
- jquery (1)
最新评论
-
aionbo:
我按你们说的也改成x86了,但还是报同样的错
跟开涛学shiro遇到异常Cannot find any provider supporting AES/CBC/PKCS5Padding【解决】 -
纵观全局:
完美解决,谢谢
跟开涛学shiro遇到异常Cannot find any provider supporting AES/CBC/PKCS5Padding【解决】 -
Blod123:
看来 还是一步步跟,我也跟了,只是没有跟到你那么深
跟开涛学shiro遇到异常Cannot find any provider supporting AES/CBC/PKCS5Padding【解决】 -
hellobleach:
楼主有没有下载的hibernate中文版 chm的下载的文件啊 ...
Hibernate注解帮助文档 -
jsd_lxf:
挺全的,感谢作者
JSTL详解
1、Pessimistic Locking 悲观锁;
pessimistic [,pesi'mistik] adj. 悲观的,厌世的;悲观主义的
2、Optimistic Locking 乐观锁;
optimistic [,?pti'mistik] adj. 乐观的;乐观主义的
hibernate锁机制
1.悲观锁
它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实现。
基于jdbc实现的数据库加锁如下:
select * from account where name="Erica" for update
在更新的过程中,数据库处于加锁状态,任何其他的针对本条数据的操作都将被延迟。本次事务提交后解锁。
而hibernate悲观锁的具体实现如下:
String sql="查询语句";
Query query=session.createQuery(sql);
query.setLockMode("对象",LockModel.UPGRADE);
说到这里,就提到了hibernate的加锁模式:
LockMode.NONE:无锁机制。
LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ:Hibernate在读取记录的时候会自动获取。
这三种加锁模式是供hibernate内部使用的,与数据库加锁无关:
LockMode.UPGRADE:利用数据库的for update字句加锁。
在这里我们要注意的是:只有在查询开始之前(也就是hiernate生成sql语句之前)加锁,才会真正通过数据库的锁机制加锁处理。否则,数据已经通过不包含for updata子句的sql语句加载进来,所谓的数据库加锁也就无从谈起。
但是,从系统的性能上来考虑,对于单机或小系统而言,这并不成问题,然而如果是在网络上的系统,同时间会有许多联机,假设有数以百计或上千甚至更多的并发访问出现,我们该怎么办?如果等到数据库解锁我们再进行下面的操作,我们浪费的资源是多少?--这也就导致了乐观锁的产生。
2.乐观锁
乐观锁定(optimistic locking)则乐观的认为资料的存取很少发生同时存取的问题,因而不作数据库层次上的锁定,为了维护正确的数据,乐观锁定采用应用程序上的逻辑实现版本控制的方法。
例如若有两个客户端,A客户先读取了账户余额100元,之后B客户也读取了账户余额100元的数据,A客户提取了50元,对数据库作了变更,此时数据库中的余额为50元,B客户也要提取30元,根据其所取得的资料,100-30将为70余额,若此时再对数据库进行变更,最后的余额就会不正确。
在不实行悲观锁定策略的情况下,数据不一致的情况一但发生,有几个解决的方法,一种是先更新为主,一种是后更新的为主,比较复杂的就是检查发生变动的数据来实现,或是检查所有属性来实现乐观锁定。
Hibernate 中透过版本号检查来实现后更新为主,这也是Hibernate所推荐的方式,在数据库中加入一个VERSON栏记录,在读取数据时连同版本号一同读取,并在更新数据时递增版本号,然后比对版本号与数据库中的版本号,如果大于数据库中的版本号则予以更新,否则就回报错误。
以刚才的例子,A客户读取账户余额1000元,并连带读取版本号为5的话,B客户此时也读取账号余额1000元,版本号也为5,A客户在领款后账户余额为500,此时将版本号加1,版本号目前为6,而数据库中版本号为5,所以予以更新,更新数据库后,数据库此时余额为500,版本号为6,B客户领款后要变更数据库,其版本号为5,但是数据库的版本号为6,此时不予更新,B客户数据重新读取数据库中新的数据并重新进行业务流程才变更数据库。
以Hibernate实现版本号控制锁定的话,我们的对象中增加一个version属性,例如:
view plaincopy to clipboardprint?
public class Account {
private int version;
....
public void setVersion(int version) {
this.version = version;
}
public int getVersion() {
return version;
}
....
}
public class Account {
private int version;
....
public void setVersion(int version) {
this.version = version;
}
public int getVersion() {
return version;
}
....
}
而在映像文件中,我们使用optimistic-lock属性设定version控制,<id>属性栏之后增加一个<version>标签,如下:
view plaincopy to clipboardprint?
<hibernate-mapping>
<class name="onlyfun.caterpillar.Account" talble="ACCOUNT"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version
">
<id...../>
<version name="version" column="VERSION"/>
....
</class>
</hibernate-mapping>
设定好版本控制之后,在上例中如果B 客户试图更新数据,将会引发StableObjectStateException例外,我们可以捕捉这个例外,在处理中重新读取数据库中的数据,同时将 B客户目前的数据与数据库中的数据秀出来,让B客户有机会比对不一致的数据,以决定要变更的部份,或者您可以设计程式自动读取新的资料,并重复扣款业务流程,直到数据可以更新为止,这一切可以在背景执行,而不用让您的客户知道。
但是乐观锁也有不能解决的问题存在:上面已经提到过乐观锁机制的实现往往基于系统中的数据存储逻辑,在我们的系统中实现,来自外部系统的用户余额更新不受我们系统的控制,有可能造成非法数据被更新至数据库。因此我们在做电子商务的时候,一定要小心的注意这项存在的问题,采用比较合理的逻辑验证,避免数据执行错误。
也可以在使用Session的load()或是lock()时指定锁定模式以进行锁定。
如果数据库不支持所指定的锁定模式,Hibernate会选择一个合适的锁定替换,而不是丢出一个例外。
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。
乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个version字段,当前值为1;而当前帐户余额字段(balance)为$100。
1. 操作员A 此时将其读出(version=1),并从其帐户余额中扣除$50($100-$50)。
2. 在操作员A操作的过程中,操作员B也读入此用户信息(version=1),并从其帐户余额中扣除$20($100-$20)。
3. 操作员A完成了修改工作,将数据版本号加一(version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version更新为2。
4. 操作员B完成了操作,也将版本号加一(version=2)试图向数据库提交数
据(balance=$80),但此时比对数据库记录版本时发现,操作员B提交的数据版本号为2,数据库记录当前版本也为2,不满足“提交版本必须大于记录当前版本才能执行更新“的乐观锁策略,因此,操作员B 的提交被驳回。这样,就避免了操作员B 用基于version=1 的旧数据修改的结果覆盖操作员A的操作结果的可能。
从上面的例子可以看出,乐观锁机制避免了长事务中的数据库加锁开销(操作员A和操作员B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。需要注意的是,乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户余额更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。在系统设计阶段,我们应该充分考虑到这些情况出现的可能性,并进行相应调整(如将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开)。Hibernate 在其数据访问引擎中内置了乐观锁实现。如果不用考虑外部系统对数据库的更新操作,利用Hibernate提供的透明化乐观锁实现,将大大提升我们的生产力。
optimistic-lock属性有如下可选取值:
none 无乐观锁
version 通过版本机制实现乐观锁
dirty 通过检查发生变动过的属性实现乐观锁
all 通过检查所有属性实现乐观锁
其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。
发表评论
-
Hibernate3 Template Dao
2017-02-23 17:10 718package com.king.stt.dao; i ... -
关于spring+hibernate的FlushMode的记录
2015-12-15 16:23 826参见hibernate的api说明https://www.h ... -
spring hibernate properties详解
2015-12-15 16:22 799spring hibernate properties详解 ... -
hibernate unique配置不起作用解决方法
2015-05-29 14:45 1434hibernate unique配置 ... -
有关Hibernate3.3.2与4.1.10测试
2013-04-26 10:18 882http://wenku.baidu.com/view/3 ... -
Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
2012-08-27 12:57 1171HQL查询方式 这一种我最常用,也是最喜欢用的,因为它 ... -
Hibernate注解帮助文档
2012-08-23 11:02 3858官网:http://www.hibernate.org ... -
HQL: Hibernate查询语言
2012-03-12 21:05 0HQL查询 节 10.01 单表HQL查询 ... -
java.lang.ClassNotFoundException: org.junit.Assume$AssumptionViolatedException
2012-03-04 21:37 8453_____构造方法“惹的祸” ___________ ... -
HQL: select子句
2012-03-04 21:19 1237查询语句可以返回值为任何类型的属性或对象,包括返回类型为某种组 ... -
HQL: Hibernate查询语言
2012-03-04 17:42 936Hibernate配备了一种非常强大的查询语言,这种语言看上去 ... -
Hibernate3.X使用weblogic布署相关问题解决2
2012-02-27 18:45 1673在(1)篇发表之后,还以为万事大吉了(注:那时(1)中的配置文 ... -
Hibernate3.X使用weblogic布署相关问题解决
2012-02-14 14:27 1792前几天一直困扰我一个问题,项目从tomcat上移植到webl ... -
Hibernate3的配置参数汇总的简介与内容
2011-08-30 12:31 9681、Hibernate JDBC属性属性名 用途 hibern ... -
搭建SSH,SSZ架构需注意数据库的编码问题
2011-08-26 11:12 1284搭建了一个Hibernate+Spring+ZKjsp的框架, ... -
hibernate映射千万注意(不能用关键字声明属性)
2011-08-20 12:09 1027lock,explain.....(陆续添加) 等在MYSQ ... -
JPA & Hibernate 注解
2011-08-19 10:08 9921、@Entity(name="Enti ... -
hibernate 注解生成表
2011-08-15 11:44 2231JPA注解,转自:http://zhaoke0427.blog ... -
Hibernate中Criteria的完整用法
2011-08-09 12:44 1026在项目中使用 Spring 和 Hibernate 进行开 ... -
Hibernate 异常 :java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
2011-07-16 20:54 6061严重: Exception sending context i ...
相关推荐
数分1.11Tableau安装及使用教程
内容概要:本文主要围绕着计算机信息系统运行管理员考试展开讨论,详细介绍了有关信息系统在运维中的各种问题及其应对方案。具体而言,文中不仅列举出了不同类型的信息系统对其本身的要求,而且还深入探讨了运维管理中面临的挑战和技术手段。另外,文章特别提及了一些特定类型的系统(例如政府系统和财务管理等),并指明在面对它们时需要考虑的安全级别、稳定性等关键要素;同时也强调了良好的文档管理和合理的设施运维对象划分,以及软硬件的选择与维护。同时文章还讲解了多种工具的作用(比如Nagios),以及硬件如计算机机房和UPS的具体规格和要求;并且讲述了关于变更管理和发布管理等的概念与实际应用场景。此外,在最后一部分内容里也谈到了云架构及其各个构成部分。 适用人群:本文适合即将参加软考信息运行管理员认证的专业人士,也适用于希望深入了解信息系统运作、管理和维护的技术从业者和相关领域的管理人员。 使用场景及目标:本资料旨在辅助考生掌握信息系统的高效、稳健地构建与运营所需的知识和技术,帮助他们顺利通过软考的同时提升实战经验;同时也为企业信息化建设提供了宝贵的理论基础和实践指南。 其他说明:虽然本文聚焦于特定职业资格证书
大型语言模型(LLMs)的出现彻底改变了自然语言处理。然而,这些模型在从大量数据集中检索精确信息时面临挑战。检索增强生成(RAG)旨在通过结合外部信息检索系统来增强LLMs,从而提高响应的准确性和上下文性。尽管有所改进,RAG在高容量、低信息密度数据库中的全面检索仍然存在困难,并且缺乏关系意识,导致答案碎片化。 为了解决这一问题,本文介绍了伪知识图谱(PKG)框架,该框架通过集成元路径检索、图内文本和向量检索到LLMs中,旨在克服这些限制。通过保留自然语言文本并利用各种检索技术,PKG提供了更丰富的知识表示并提高了信息检索的准确性。使用Open Compass和MultiHop-RAG基准进行的广泛评估表明,该框架在管理和处理大量数据及复杂关系方面具有有效性。
python学习教程
请到网盘中自取压缩包,此包为kibana-7.10.2 镜像压缩包,是通过现有镜像导出来的,主要是为了解决有些机器无法连接外网,导致无法下载镜像 加载镜像: docker load -i kibana-7.10.2.tar 查看镜像: docker images 备注:elk此镜像配套资源,相同版本的elasticsearch和logstash,请在我的资源中搜索其他镜像
UniApp开发一个简单的记事本应用文字教程
基于Andorid的音乐播放器项目设计(QQ音乐)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
React Developer Tools在谷歌拓展的应用商城下载不了任何解决
【毕业设计-java】springboot-vue健身房管理系统源码(完整前后端+mysql+说明文档+LunW).zip
python学习资源
本文提供了一套完整的指南,帮助用户在Anaconda中配置PyTorch环境,便于深度学习开发。首先,用户需要确保安装Anaconda,并通过Anaconda Prompt创建一个新的虚拟环境,以隔离项目依赖。创建好环境后,用户可以根据所用操作系统以及CUDA版本,选择适合的安装命令。对于Windows和Linux用户,提供了安装PyTorch、TorchVision和TorchAudio的具体命令,包括CUDA Toolkit的版本选择。macOS用户则可以安装仅支持CPU的版本。安装完成后,通过简单的Python代码验证PyTorch是否成功安装以及GPU的可用性。文中还列出了常见问题及解决方法,帮助用户快速排查安装过程中可能遇到的障碍。通过遵循这些步骤,用户可以顺利搭建起一个专属的PyTorch开发环境,提升深度学习的工作效率和体验。
python学习教程
内容概要:本文汇总了学习数据结构的相关资源,旨在帮助读者系统化地理解和掌握这一计算机科学的基础概念。文中首先列举了一系列权威在线学习资源,包括知名教授的主页、在线编程平台LeetCode和技术博客,这些资源不仅理论丰富,还提供大量的实例和练习机会。接着推荐了几本经典的书籍,如《算法导论》、《大话数据结构》,适合不同程度的学习者深入理解算法和数据结构的细节。此外,还特别提及了几门高质量的网络课程,能够为初学者提供清晰的学习路径。最后强调通过动手实践,如动态数组的C语言实现以及算法题目的刷题练习,是提高编程技能的有效途径。 适合人群:对于想要系统学习并掌握数据结构的程序员及爱好者。 使用场景及目标:适用于个人自学或者课堂教学,目的是通过综合使用理论学习、实践操作来达到对数据结构和算法有全面深刻的认识。 其他说明:本文提供了丰富的链接,让读者可以直接访问各个优质教育资源进行深度探究,鼓励大家积极参与讨论,相互分享心得体验,形成良好的互动交流氛围。
QMI8658 Datasheet
【毕业设计】java-springboot-vue火车订票管理系统源码(完整前后端+mysql+说明文档+LunW).zip
Screenshot_2025-03-10-22-52-22-034_com.miui.notes.jpg
python学习教程
基于unet医学细胞分割python实战源码+数据集(图像分割大作业).zip 【项目简介】 该项目是一个基于 U-Net 的医学细胞分割实战项目,适合初学者学习。项目包含了数据集准备、模型构建、训练和验证等完整的流程。 主要功能 实现 U-Net 模型的构建和训练 提供医学细胞分割的数据集和数据预处理 实现分割模型的评估指标,如 Dice 系数等 Python PyTorch U-Net 模型 【项目说明】 1.多数小白下载后,在使用过程,可能会遇到些小问题,若自己解决不了,请及时私信描述你的问题,我会第一时间提供帮助,也可以远程指导 2.项目代码完整可靠,但难度适中,满足一些毕设、课设要求,且属于易上手的优质项目,项目内基本都有说明文档,按照操作即可,遇到困难也可私信交流 3.适用人群:各大计算机相关专业行业的在校学生、高校老师、公司程序员等下载使用