NHibernate 3.0 Cookbook第三章,Using stateless sessions的翻译.

当要处理大量的数据,你通常可能会使用更"底层"的API来改善性能,在这次处理中很多时候会关闭一些高级特性.在NHibernate中,无状态Session就是高性能,底层的API.

这个文章,我们会使用一个无状态的Session来更新我们的电影价格.

准备

像前面的一样,建立一个控制台应用程序,参考第二章使用app.config配置NHibernate,使用Eg.Core Model.

怎样做

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

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.下一步,去更新我们的电影的价格,在Main方法中添加如下代码:

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方法:

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

4.最后,添加UpdateMoviePrice方法:

static Random rnd = new Random();

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

原理

使用一个无状态Session,我们新建了1000个电影.无状态的Session没有实现transactional write-behind,也就是说SQL语句不会延迟到我们提交事务才执行.然而,当我们打开批处理,它们不会立即执行.同一时间会有100条插入语句排队等候并且一起发送所有语句.如果我们关闭批处理,这样就会每调用session.Insert就会马上发送一条语句.

下一步,我们用一条查询语句获取所有电影.这些电影是游离态的;它们没有和一个Session关联.实体不会与无状态的Session关联.无论我们使用查询还是Get方法加载实体都是这样的情况.

因为无状态Session没有实现自动脏检查(automatic dirty checking),我们必须调用session.Update来保存电影的改变.

There's more...

一个无状态Session本质上是一个标准Session的简化版.它不使用一级缓存,也不执行自动脏检查(automatic dirty checking),也不支持延迟加载.实际上,它甚至没有保存实体的引用,以帮助防止处理数千实体时内存泄漏.级联被忽略.你每次都必须明确地插入,更新,或者删除每个实体.无状态Session还会忽略二级缓存,事件监听(event listeners),拦截器(interceptors),甚至NHibernate.SQL的log4net记录器.

尽管有这些局限性,当你需要使用真实对象(real objects)时,无状态Session在高性能批处理情景中是非常有用的.当你要用原始数据(raw data)时,这里通常有更好的代替方案,例如简单的旧的SQL(plain old SQL),HQL批处理(HQL bulk actions),SqlBulkCopy,或者ETL tools.至于简单的旧的SQL(plain old SQL),session.Connection属性使得可以简单地使用ADO.NET的connection对象,然后你可以像以前那样写ADO.NET代码.

NHibernate使用无状态Sessions的更多相关文章

  1. SpringCloud系列三:SpringSecurity 安全访问(配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类)

    1.概念:SpringSecurity 安全访问 2.具体内容 所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息 ...

  2. 有状态Bean和无状态Bean的定义

    有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一个初 ...

  3. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

  4. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  5. REST有状态与无状态的理解

    1. 什么是REST? REST(REpresentation State Transfer)表述性状态传递,是一种软件架构风格,是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可 ...

  6. 无状态的web应用

    无意间看到这个话题,随便看了下 觉得有点意思.比较零散,记录一下. 1. http协议无状态. 简单的理解:每一个http请求都是独立的.不会因为前一个请求的失败就影响到下一个请求.既不会影响前面的, ...

  7. 无状态Web应用集成——《跟我学Shiro》

    http://www.tuicool.com/articles/iu2qEf 在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上 ...

  8. 无状态服务(stateless service)

    一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本 ...

  9. 对于REST中无状态(stateless)的一点认识

    今天早上在Yahoo的邮件列表里看到一篇颇有意思的讨论,标题为RESTful vs. unRESTful: Session IDs and Authentication(51CTO编者注:意为REST ...

随机推荐

  1. Java集合里的一些“坑”

    这里主要谈下Java集合在使用中容易被忽略.又容易出现的两个“坑”,一个是集合与数组互相转换,另一个是集合遍历删除.主要通过代码演示. 一.集合与数组互相转换中的“坑” //Test1.java pa ...

  2. jquery如何获取第一个或最后一个子元素

      jquery如何获取第一个或最后一个子元素? 通过children方法,children("input:first-child") $(this).children(" ...

  3. 数据分析python应用到的ggplot(二)

    还是优达学院的第七课 数据:https://s3.amazonaws.com/content.udacity-data.com/courses/ud359/hr_by_team_year_sf_la. ...

  4. django时差8个小时问题

    问题现象: 在用django做好的网站,上传图片后显示的发布时间比当前时间差了8小时 查找问题: 查看服务器系统时间,经查与当前时间一致,无问题 查看数据库中的时间也一样 最终原因: 在setting ...

  5. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  6. Hadoop案例(六)小文件处理(自定义InputFormat)

    小文件处理(自定义InputFormat) 1.需求分析 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案.将多个小文件合并 ...

  7. pymongo的一些操作

    参考:http://www.yiibai.com/mongodb/mongodb_drop_collection.html http://www.cnblogs.com/zhouxuchen/p/55 ...

  8. [实战]MVC5+EF6+MySql企业网盘实战(20)——Bootstrap Paginator

    写在前面 考虑到数据量的问题,特引入bootstrap的分页插件.插件下载地址:https://github.com/lyonlai/bootstrap-paginator 系列文章 [EF]vs15 ...

  9. 使用minikube在windows构建kubernetes群集

    只建议在开发环境中使用,不建议在windows下使用docker或者kubernetes. 1. 安装VirtualBox或者Hyper-v(安装步骤略) 2. 下载kubectl和minikube工 ...

  10. HDU 6025 Coprime Sequence

    枚举,预处理. 预处理前缀$gcd$与后缀$gcd$,枚举删哪一个即可. #include <bits/stdc++.h> using namespace std; int T,n; ]; ...