hibernate锁
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate锁内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate锁相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate锁相关知识
-
Hibernate 一对多双向映射及乐观锁使用Hibernate 一对多双向映射及乐观锁使用 在“Hibernate关联关系映射实例速查”一文中,通过myeclipse5.5,快速做出了Hibernate各种映射的示例。时隔快一年了,但是还是有博友向我索要工程源码,很遗憾的是已经找不到了。但找到一了一个测试代码:对双向关联和乐观锁的测试。其实映射类型很多,搞清楚一对多,基本上所有的映射就搞明白了,一对一也是一对多的特例而已,多对多也可以转换为一对多和多对一,并且实际中很少用到多对多。 还是老规矩,因为是测试,代码几乎全部是myeclipse生成的,我稍作了修改。并且应博友“阿飞”的留言,我做了详细的注释。 例子两部分:1、一对多双向映射:模型是“班级-学生”模型。两个实体分别是Tclass和Student。2、乐观锁的是使用,版本分别使用递增整数和时间戳。两个实体分别是Foo和Bar。 Tclass实体及其映射:public class Tclass implements java.io.Serial
-
HibernateORM概念O:Object 对象R:Relation 关系 (关系型数据库)外键就是关系M:Mapping 映射关系型数据库,对应的有对象型数据库,比较少用。现在主流的是关系型数据库。MYSQL, Oracle...等都是关系型数据库。ORM解决什么问题?存储:能把对象的数据直接保存到数据库获取:能直接从数据库拿到一个对象要做到上面2点,必须要有映射。图片.pngHibernate和ORM的关系是什么?Hibernate实现了 ORM。ORM相当于是一种思想。比较好的hibernate博文:http://blog.csdn.net/jiuqiyuliang/article/details/39078749图片.png1.Hibernate 案例搭建一个Hibernate环境,开发步骤:1)下载源码:版本:hibernate-distribution-3.6.0.Final2)引入jar文件hibernate3.jar核心 + required 必须引入的(6个)+ jpa + 数据库
-
001 Hibernate 初始Hibernate 是什么Hibernate 是一个优秀的Java持久层矿建Hibernate 是对 JDBC 做轻量级封装的ORM框架Eclipse 下Hibenate 插件安装 参考:http://www.cnblogs.com/AlanLee/p/5836823.htmlHibernate 初始导入相关jar包导入Hibernate jar包导入hibernate 下 lib目录下required下所有的jar导入数据驱动jar编写代码创建Hibernate配置文件(hibernate.cfg.xml)编写实体类 编写实体映射文件 编写测试代码<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Conf
-
Hibernate【入门篇】tags: Hibernate 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象! 为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC中的数据持久层->在编写程序中的DAO层... 首先,我们来回顾一下我们在DAO层写程序的历程吧: 在DAO
hibernate锁相关课程
hibernate锁相关教程
- Hiberntae 实现悲观锁 前面我们使用过 Session 的 get()方法,大家还记得是怎么用的吗?stu = (Student) session.get(Student.class, new Integer(1));其实这个方法还可以传递第三个参数,好吧,先看一下方法的原型:public Object get(Class clazz, Serializable id, LockOptions lockOptions);LockOptions 类本质是对 LockMode 枚举类型的高级封装,提供了几种锁的使用:无锁的机制,Transaction 结束时,切换到此模式;hibernate 内部使用。public static final LockOptions NONE = new LockOptions(LockMode.NONE);查询的时候,Hibernate 自动获取锁;hibernate 内部使用。public static final LockOptions READ = new LockOptions(LockMode.READ);利用数据库的 for update 子句加锁(Select * from 表 for update),通过此选项实现悲观锁。public static final LockOptions UPGRADE = new LockOptions(LockMode.UPGRADE);悲观锁在实际生产环境中使用频率并不高,限制了并发的发生率,降低了程序的响应速度。编写一个简单的测试实例:第一个事务,查询加锁,使用 Thread.sleep()模拟事务操作时长;模拟时间不要太长,如果长时间不释放锁,其它等待事务会抛出等待超时异常。stu = (Student) session.get(Student.class, new Integer(1), LockOptions.UPGRADE);Thread.sleep(30000);transaction.commit();System.out.println("-----------第一个事务结束-----------");执行此实例,查看控制台输出信息,查询语句上添加了 for update,在模拟时长内事务没有结束。Hibernate: select student0_.stuId as stuId1_1_0_, student0_.classRoomId as classRoo5_1_0_, student0_.stuName as stuName2_1_0_, student0_.stuPassword as stuPassw3_1_0_, student0_.stuSex as stuSex4_1_0_ from Student student0_ where student0_.stuId=? for update第二个事务,进行查询、更新操作,此事务并不能马上更新成功,只有等待第一个事务结束后才能成功。 stu = (Student) session.get(Student.class, new Integer(1)); System.out.println("-------------更新-------------"); stu.setStuName("Hibernate 01"); transaction.commit(); System.out.println("--------------更新成功-----------");悲观锁的实现很简单,也很好理解,无非就是我用时你不能用的问题。
- 3. 悲观锁 Pessimistic Locking 悲观地认为并发的事务时时会发生,总是担心隔离机制不能很好的保证事务之间的安全性。基本思想就是当一个事务读取某一条记录后,就会把这条记录锁住,如果其它的事务要想更新,必须等以前的事务提交或者回滚解除锁;悲观锁的实现,一般依靠数据库提供的锁机制。只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在系统中实现了加锁机制,也无法保证外部系统不会修改数据。SQL 的 select 语句中有一个 for 语法关键字:SELECT * from student where stuName='Hibernate' for UPDATE其作用就是锁定这条记录,当前事务没有结束之前,其它的事务不能在这条记录上进行数据更新操作。
- 2. Hibernate 中的隔离机制 如前面课程所述,隔离机制能保证事务之间的良好秩序,但是,太严格的隔离机制会让事务之间产生时间上的等待或延迟,也就是说并发性弱。太松散的隔离机制,虽然可以增加并发性,但可能会产生事务之间的数据脏读等一系列不希望出现的事情。有时,纯粹地依靠 JDBC 提供的 4 种隔离机制很难做到隔离的优雅性,所以,一般采用 读取已提交 或者 更低的事务隔离级别,再配合各种并发访问控制策略来达到并发事务控制的目的。Hibernate 中如何设置隔离机制?这个问题很简单,你要做的就是在 Hibernate 主配置文件中添加如下信息:<property name="connection.isolation">2</property>这里的 2 是什么意思?是这样的,Hibernate 使用 1 、2 、4 、8 这几个数字分别代表 4 种隔离机制。8 - Serializable 串行化;4 - Repeatable Read 可重复读;2 - Read Commited 可读已提交;1 - Read Uncommited 可读未提交。使用数字有几个好处,毕竟不用记那么一长串字符串,最主要的是,这几个数字可以换算成 二进制中的 0001、0010、0100、1000。可以直接通过二进制位运算的方式进行权限控制。设置就是这么简单,但是,这还不够。刚说过, 最好再配合并发控制策略。那么, Hibernate 提供了怎样的 策略,告诉你,有 2 种 “锁” 机制:乐观锁;悲观锁。你是喜欢先苦后甜还是先甜后苦了,我喜欢先苦后甜。好吧,先讲解什么是悲观锁。
- 4. 乐观锁 乐观是一种积极的解决问题的态度。所谓乐观锁认为系统中的事务并发更新不会很频繁,即使冲突了也没事,大不了重新再来一次。基本思想:每次提交一个事务更新时,查看要修改的数据从上次读取以后有没有被其它事务修改过,如果修改过,那么更新就会失败。实现方案:在实体中增加一个版本控制字段,每次事务更新后就将版本 (Version) 字段的值加 1。Tips: 乐观锁本质就是版本控制管理的实现,记录的每一次更新操作都会以版本递增的方式进行记录。一个事务在更新之前,先获取记录的当前版本号,更新时,如果版本还是最新的则可以更新,否则说明有事务比你先更新,则需要放弃。或者重新查询到最新版本信息后再更新。所以,在乐观锁的实现中,冲突是常态。实现过程:在学生实体类中添加新属性,用来记录每次更新的版本号。public class Student implements Serializable {//省略…… @Versionprivate Long version;//省略…… }stu = (Student) session.get(Student.class, new Integer(1));System.out.println("当前版本号:"+stu.getVersion);//模拟延迟,如果在这个时间内有其它事务进行了更新操作,此事务的更新不会成功Thread.sleep(30000);stu.setStuName("Hibernate");transaction.commit();好了,悲观也好,乐观也好,只是一种解决问题的态度。对于这两种态度,咱们要总结一下。乐观锁:优势:性能好,并发性高。缺点:用户体验不好,可能会出现高高兴兴去更新,却告知已经有人捷足先登了。悲观锁:优势:锁住记录为我所用,没修改完成之前,其他事务只能瞪眼瞧着,时间虽然延迟,至少心里有底。缺点:并发性不好,性能不高。Hibernate 的其它性能优化:随时使用 Session.clear()及时清除 Session 缓存区的内容;1+N 问题 ( 一条 SQL 语句能解决的问题用了很多条 SQL 语句来实现) ;使用 Criteria 查询可以解决这个问题;Lazy 加载:需要时,使用 get() 方法发出 SQL 语句。使用类似于 from Student s left join s.classRoom c 的关联查询语句。缓存使用:在对象更新、删除、添加相对于查询要少得多时, 二级缓存的应用将不怕 n+1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的,刚好又利用了 n+1。
- 5. 公平锁与非公平锁 分类:根据线程获取锁的抢占机制,锁可以分为公平锁和非公平锁。公平锁:表示线程获取锁的顺序是按照线程请求锁的时间早晚来决定的,也就是最早请求锁的线程将最早获取到锁。非公平锁:非公平锁则在运行时闯入,不遵循先到先执行的规则。ReentrantLock:ReentrantLock 提供了公平和非公平锁的实现。我们本节只做介绍,后续章节会对 ReentrantLock 进行深入的讲解。
- Hibernate 简介 图片来自 Hibernate 官网
hibernate锁相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle