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

Using stateless sessions

使用无状态会话

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

准备

使用第一章的Eg.Core和第二章的Configuring NHibernate with App.config来创建一个控制台应用程序.

步骤

1.   先创建一些数据,在Main方法中添加下面的代码:

View Code
using (var session = sessionFactory.OpenStatelessSession())
{using (var tx = session.BeginTransaction()){for (int i = 0; i < 1000; i++)session.Insert(new Movie(){Name = "Movie " + i.ToString(),Description = "A great movie!",UnitPrice = 14.95M,Director = "Johnny Smith"});tx.Commit();}
}

2.   下一步,更新movie的价格,在Main方法中添加下面的代码:

View Code
using (var session = sessionFactory.OpenStatelessSession())
{using (var tx = session.BeginTransaction()){var movies = GetMovies(session);foreach (var movie in movies){UpdateMoviePrice(movie);session.Update(movie);}tx.Commit();}
}

3.   添加GetMovies方法:

View Code
static IEnumerable<Movie> GetMovies(IStatelessSession session)
{return session.CreateQuery("from Movie").List<Movie>();
}

4.   最后,添加UpdateMoviePrice方法:

View Code
static Random rnd = new Random();
static void UpdateMoviePrice(Movie movie)
{// Random price between $9.95 and $24.95movie.UnitPrice = (decimal) rnd.Next(10, 26) - 0.05M;
}

原理

  使用无状态会话,我们创建了1000个movie对象.无状态会话不支持事务处理的迟写机制,这意味着SQL语句不再被延迟到提交事务时.然而因为我们打开了批处理功能,所以这些语句也不会马上生效.累积100条insert语句后会被一起发送.如果关闭了批处理功能,每次调用session.Insert时,每条语句都会被立即执行,也就是一次发送一条语句.
  下一步,使用了一个查询从数据库中获取了所有的movie.这些movie是分离状态的,没有同会话相关联.实体无法和无状态会话相关联.情况就是这样的,无论是通过查询获得实体还是通过Get方法.因为无状态会话无法实现自动脏校验,所以我们必须调用session.Update来保存对每个movie的更改.

扩展

  无状态会话本质上是标准NHibernate会话的精简版.她不使用一级缓存也不执行自动脏校验,并且不支持延迟加载.事实上,她设置不保持对实体的引用,在处理成千上万的实体时,保持对实体的引用有助于避免内存泄露.级联是被忽略的.必须显式调用insert, update,或delete来操作每个实体,不会级联.无状态会话也会绕开二级缓存,事件监视器,拦截器,甚至NHibernate.SQL的log4net日志记录器.
忽略这些限制,无状态会话在需要处理实际对象的高性能批处理环境下是非常有用的.当你可以处理原始数据时,通常有更好的替代品就像原始的SQL,HQL bulk actions,SqlBulkCopy或者是ETL tools.对于原始的SQL,可以从session.Connection来简单访问ADO.NET连接对象,而且你可以如往常一样写你的ADO.NET代码.

转载于:https://www.cnblogs.com/carfieldSE/archive/2012/07/15/2592049.html

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

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

相关文章

致电以验证您的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风格漂亮界面…

vuex 管理vue-router的传值

假设有这样的一种情况&#xff0c;在两个组件中。一个组件【A】主要是比如说放表格数据&#xff0c;而另外一个组件【B】是专门用来向组件A的表格添加数据的表单。这个时候就是两个兄弟组件之间传递数据了。首先想到的是使用兄弟组件传递数据的方法&#xff1a; 新建一个中间件…

命令行下使用curl,采集数据遇到的问题。

前几天遇到这样一个问题&#xff0c;写了一段php采集程序&#xff0c;里面用到了curl_init()等&#xff0c;在浏览器里可以获得数据&#xff0c;但在命令行里不可以用的php环境是wamp&#xff0c;加载了php_curl&#xff0c; php.ini文件里面加载的&#xff0c;打印phpinfo 也显…

纪事地图和Yahoo Cloud服务基准

总览 Yahoo Cloud Service Benchmark是一种相当广泛使用的基准测试工具&#xff0c;用于测试大量密钥&#xff08;例如1亿&#xff09;和少量客户端&#xff08;即由一台计算机提供服务&#xff09;的密钥值存储。 在本文中&#xff0c;我将研究如何使用Chronicle Map在具有12…

JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案

最近在编写一个小型基于的jsp系统开发。掌握数据库一直感觉还不错。但是今天就出现了一个问题困扰我大半天。后来本来准备睡觉&#xff0c;但是觉得今天不解决这个问题恐怕晚上是“彻夜难眠啊”&#xff01;&#xff01;于是打开电脑&#xff0c;又开始捣腾。遇到问题首先去网上…

c++ 错误处理

void __fastcall TForm1::Button1Click(TObject *Sender) { try { int iEdit1->Text.ToInt(); Edit1->TextAnsiString(10/i); } catch (...) { ShowMessage("Error"); } } 通过 为知笔记 发布转载于:https://www.cnblogs.com/xe2011/archive/2012/07/16/55298e…

使用FizzBu​​zz和Mockito进行单元测试

我有时使用FizzBu​​zz向新手演示单元测试的基础。 尽管FizzBu​​zz确实是一个简单的问题&#xff0c;但是它也可以用于演示更高级的单元测试技术&#xff0c;例如模拟 。 FizzBu​​zz Kata&#xff1a; “ 编写一个程序&#xff0c;打印从1到100的数字。但是&#xff0c;…

前后端分手大师——MVVM 模式

阅读目录简而言之组成部分没有什么是一个栗子不能解决的简而言之 之前对 MVVM 模式一直只是模模糊糊的认识&#xff0c;正所谓没有实践就没有发言权&#xff0c;通过这两年对 Vue 框架的深入学习和项目实践&#xff0c;终于可以装B了有了拨开云雾见月明的感觉。 Model–View–…

Java性能调优调查结果(第三部分)

这是该系列文章的第三篇&#xff0c;我们将分析2014年10月进行的调查的结果。如果您尚未这样做&#xff0c;我建议从该系列的前两篇文章开始&#xff1a; 问题严重性分析和监视域分析 。 这篇文章着重于故障排除/根本原因检测。 本调查部分的背景&#xff1a;意识到性能问题并…

划分树

昨天的杭电多校联合训练热身赛的一道题&#xff0c;求区间的中位数&#xff0c;快排会超时&#xff0c;划分树的模版题。。 划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内&#xff09;序列区间的第k大值 。划分树和归并树都是用线段树作为辅助的…

Canvas事件绑定

canvas事件绑定 众所周知canvas是位图&#xff0c;在位图里我们可以在里面画各种东西&#xff0c;可以是图片&#xff0c;可以是线条等等。那我们想给canvas里的某一张图片添加一个点击事件该怎么做到。而js只能监听到canvas的事件&#xff0c;很明显这个图片是不存在与dom里面…

使用Maven配置JBoss / Wildfly数据源

大多数Java EE应用程序在其业务逻辑中使用数据库访问&#xff0c;因此开发人员经常面临在应用程序服务器中配置驱动程序和数据库连接属性的需求。 在本文中&#xff0c;我们将使用Maven为JBoss / Wildfly和Postgre数据库自动化该任务。 这项工作是根据我从以前的魔兽拍卖批量应…

控件注册 - 利用资源文件将dll、ocx打包进exe文件(转)

很多时候自定义或者引用控件都需要注册才能使用&#xff0c;但是如何使要注册的dll或ocx打包到exe中&#xff0c;使用户下载以后看到的只是一个exe,点击直接运行呢&#xff1f;就像很多安全控件&#xff0c;如支付宝的aliedit.exe那样。 现在介绍一种使用资源文件&#xff0c;将…

Canvas-图片旋转

Canvas-图片旋转 众所周知canvas是位图&#xff0c;你可以在里面渲染你要的东西&#xff0c;不过你只能操作canvas的属性来进行编辑。就是说你并不能操作画进canvas的东西&#xff0c;例如我在canvas里添加一幅画&#xff0c;我现在想将那幅画移动10px&#xff0c;我们并不能直…

在嵌入式Neo4j中使用Neo4j浏览器

有时候&#xff0c;您有一个应用程序以嵌入式模式使用Neo4j&#xff0c;但还需要使用Neo4j Web浏览器来处理图形。 由于一次最多只能从一个进程访问数据库&#xff0c;因此在嵌入式Neo4j应用程序运行时尝试启动Neo4j服务器将无法工作。 WrappingNeoServerBootstrapper尽管已被…

CSS3实现多页签图片缩放切换效果

多页签切换效果&#xff0c;图片缩放&#xff0c;鼠标移动到图片上后显示文字内容等等&#xff0c;效果很集中呐 截图如下&#xff1a; 下载地址&#xff1a;http://www.lanrenzhijia.com/js/css3/2012/0718/602.html 预览地址&#xff1a;http://www.lanrenzhijia.com/yulan/2…

正则表达式学习笔记

该笔记内容通过《Learn regular expressions in about 55 minutes》整理得到。 文章链接&#xff1a;https://qntm.org/files/re/re.html 其中文翻译很多&#xff0c;中文名叫&#xff1a;55分钟学会正则表达式。 实际上我也算过了&#xff0c;55分钟实在不太可能&#xff0c;也…

清洁单元测试图案–演示幻灯片

我有机会在2014年GDG DevFestKarlsruhe会议上谈论“清洁单元测试模式”。 感谢组织者邀请我&#xff0c;也感谢所有听我讲话的人。 如所承诺的&#xff0c;我为那些想看一下我在演讲中没有讲到的其他幻灯片的人分享了演示文稿&#xff1a; 清洁单元测试图案 JUnit测试并不像看…

“取反”运算符

“取反”运算符转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/24/3845558.html