Hibernate应用程序级可重复读取

介绍

在我以前的文章中,我描述了应用程序级事务如何为长时间的对话提供合适的并发控制机制。

所有实体都在Hibernate会话的上下文中加载,充当事务后写式缓存 。

Hibernate持久性上下文可以包含给定实体的一个引用和一个引用。 一级缓存可确保会话级可重复读取。

如果对话跨越多个请求,我们可以进行应用程序级的可重复读取。 长时间的对话本质上是有状态的,因此我们可以选择分离的对象长期的持久性上下文 。 但是,应用程序级可重复读取需要应用程序级并发控制策略,例如乐观锁定。

抓住

但是这种行为有时可能被证明是出乎意料的。

如果您的Hibernate会话已经加载了给定的实体,那么任何后续的实体查询(JPQL / HQL)都将返回完全相同的对象引用(不考虑当前加载的数据库快照):

应用程序级别可重复读取

在此示例中,我们可以看到第一级缓存可防止覆盖已加载的实体。 为了证明这种行为,我提出了以下测试案例:

final ExecutorService executorService = Executors.newSingleThreadExecutor();doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {Product product = new Product();product.setId(1L);product.setQuantity(7L);session.persist(product);return null;}
});doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {final Product product = (Product) session.get(Product.class, 1L);try {executorService.submit(new Callable<Void>() {@Overridepublic Void call() throws Exception {return doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session _session) {Product otherThreadProduct = (Product) _session.get(Product.class, 1L);assertNotSame(product, otherThreadProduct);otherThreadProduct.setQuantity(6L);return null;}});}}).get();Product reloadedProduct = (Product) session.createQuery("from Product").uniqueResult();assertEquals(7L, reloadedProduct.getQuantity());assertEquals(6L, ((Number) session.createSQLQuery("select quantity from Product where id = :id").setParameter("id", product.getId()).uniqueResult()).longValue());} catch (Exception e) {fail(e.getMessage());}return null;}
});

该测试案例清楚地说明了实体查询和SQL预测之间的区别。 尽管SQL查询投影总是加载最新的数据库状态,但是实体查询结果由第一级缓存管理,以确保会话级可重复读取。

解决方法1:如果您的用例要求重新加载最新的数据库实体状态,则只需刷新有问题的实体。

解决方法2:如果希望将某个实体与Hibernate一级缓存解除关联,则可以轻松地将其退出 ,因此下一个实体查询可以使用最新的数据库实体值。

超越偏见

休眠是一种手段,而不是目标。 数据访问层既需要读取又需要写入,而普通的JDBC和Hibernate都不是一种千篇一律的解决方案。 数据知识堆栈更适合于获取最多的数据读取查询和写入DML语句。

尽管原生SQL仍然是事实上的关系数据读取技术,但是Hibernate在写入数据方面表现出色。 Hibernate是一个持久性框架,您永远不要忘记这一点。 如果计划将更改传播回数据库,则加载实体是有意义的。 您不需要加载用于显示只读视图的实体,在这种情况下,SQL投影是更好的选择。

会话级可重复读取可防止并发写入场景中的更新丢失,因此,有充分的理由说明实体不会自动刷新。 也许我们选择了手动刷新脏属性 ,并且自动刷新实体可能会覆盖同步的未决更改。

设计数据访问模式并不是一件容易的事,值得投资坚实的集成测试基础。为避免任何未知行为,我强烈建议您验证所有自动生成的SQL语句,以证明其有效性和效率 。

  • 代码可在GitHub上获得 。

翻译自: https://www.javacodegeeks.com/2014/10/hibernate-application-level-repeatable-reads.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU-2732 Leapin' Lizards 最大流

题目意思是有一些蜥蜴在一个迷宫里面&#xff0c;求这些蜥蜴还有多少是无论如何都逃不出来的。题目只给定一个行数&#xff0c;一个最远能够跳跃的距离&#xff0c;列数是不确定的&#xff08;题目告知列数小于等于20&#xff09;&#xff0c;但是数据一定会是一个矩阵。每只蜥…

canvas动画简单操作

canvas动画 小球滚动效果 关键api&#xff1a; window.requestAnimationFrame(draw) 会递归调用draw函数&#xff0c;替代setIntervalvar x 20; var speed 4; //电脑的帧率是1秒钟60Hz&#xff0c; 就相当于一秒钟可以播放60张图片&#xff0c;就相当于播放一张图片使用16.…

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…

node.js 搭建http调取 mysql数据库中的值

首先&#xff0c;我们先在数据库中创建两个表t_news,t_news_type;插入数据&#xff1a; 然后我们再写代码&#xff1a; //加载模块express var express require("express"); var fs require("fs"); //加载路径 var url require("url"); //加…

Spring Caching抽象和Google Guava Cache

Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。 我的目的是要介绍Spring现在为框架的4.0版本提供的较新的缓存实现之一-使用Google Guava Cache 简而言之&#xff0c;请考虑一种具有几种慢速方法的服务&#xff1a; public class DummyBoo…

NHibernate.3.0.Cookbook第三章第9节的翻译

Using stateless sessions 使用无状态会话 当进行大量数据处理的时候,可能会放弃使用一些高级特性,而使用更接近底层的API来提高性能.在NHibernate中,这种高性能的底层API就是无状态的会话.本节介绍如何使用无状态会话来更新movie对象的价格. 准备 使用第一章的Eg.Core和第二章…

致电以验证您的JavaFX UI的响应能力

最近&#xff0c;Jim Weaver在他的Surface Pro上为演示安装了我的小图片索引应用“ picmodo”&#xff0c;并且GUI变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&#xff1a; 我认为&#xff0c;即使调整大小行为和预期一样工作&#xff0c;UI也绝…

上周热点回顾(7.9-7.15)

热点随笔&#xff1a; 2012五大主流浏览器 HTML5 和 CSS3 兼容性大比拼&#xff08;梦想天空&#xff08;山边小溪&#xff09;&#xff09; 原创&#xff1a;让密码不再被遗忘 - 在web中尝试图形口令&#xff01;&#xff08;网无忌&#xff09; 构建一个Outlook风格漂亮界面…