NHibernate使用无状态Sessions

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代码.

时间: 2024-10-31 03:12:43

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

无状态服务(stateless service)

一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息 有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的 二.优劣 有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案).举一个常见的例子,在商城里购买一件商品.需要经过放入购物车.确认订单.付款等多个步骤.由于HTTP协议本身是

Web中的无状态含义

REST架构设计是目前非常火热的概念,已经成为构建web服务时应该遵循的事实标准.REST约束中有一条很重要的规则是“无状态”,但“无状态”是个很抽象的概念,对刚刚接触的人来讲,很难深刻形象的理解.今天在网上看了一篇文章,对于“无状态”的解释感觉很容易让人理解,特把文章中相关内容整理了下. "状态"的概念是什么 一个Web应用程序协议的“状态”在通常指的是为两个相互关联的用户交互操作保留的某种公共信息,它们常常被用来存储工作流或用户状态信息等数据.这些信息可以被指定不同的作用域如pag

无状态会话bean(1)---定义

无状态会话bean用于完毕在单个方法的生命周期内的操作.无状态bean能够实现很多业务操作,可是每一个方法都不能假定不论什么其它的方法会在它之前调用.后半句的意思是如今的你可能不是刚才的你.明天的你可也能不是今天的你,这个时候你就叫做"无状态你". 上面的阐述听起来像是无状态的bean的一个局限,好像每次再见就像永别似的. 可是这是迄今为止业务服务最常见的形式,就像去饭店吃饭,点菜的服务员与给你上菜的服务员是不是同一个这不是我们所关心的. 无状态回话bean不同于适合在对话中积累状态(

无状态会话bean(1)---定义(未排版)

无状态会话bean用于完成在单个方法的生命周期内的操作.无状态bean可以实现许多业务操作,但是每个方法都不能假定任何其他的方法会在它之前调用. 这听起来像是无状态的bean的一个局限.但是这是迄今为止业务服务最常见的形式.不同于适合在对话中积累状态(如零售应用程序的购物车)的有状态会话bean,无状态回话bean旨在非常有效的执行独立操作.无状态会话bean可以在最小化对整体服务器资源影响的同时,扩展到大量的客户端. 会话bean定义分为如下两个部分: 零个或多个业务接口,定义了一个客户端在b

JSP中对页面跳转的不同方法引出HTTP无状态的应对方法

首先我们来看今天所学应用到的一个例子,当我们做了一个登陆页面,提交表单后往往需要跳转到另外一个页面.这里可以用两个方法,方法如下: 1.response用法: response.sendRedirect("URL");  (是对服务器请求的响应) 2.request的用法: request.getRequestDispatcher("URL").forward(request, response);   (是装载着客户端请求的信息集合) 但是两种用法是有所不同的.r

有状态和无状态

无状态对象 用于处理逻辑, 而不是持有数据 把数据从一个有状态对象处理后传输到另一个有状态对象 属性和字段都是临时的, 不共享, 无需持久化 使用时随时创建, 随时丢弃 有状态对象 持用数据 共享 需要持久化 保持内部数据一致 版本, 身份, 值比较, HashCode 数据访问: 遍历, 查找, 排序 数据变化事件

Java深度历险(二) EJB Session Bean有状态和无状态的区别与联系

刚开始对两种sessionbean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后,会发现,事实恰好相反:有状态和无状态会话bean的本质区别是它们的生命期. 首先解释一个下面要用到的概念--用户:sessionbean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法.同一个类的不同实例对于session bean来说是不同的用户. 实例解析 有状态的StatefulEjb

java无状态登录实现方式之ThreadLocal+Cookie

注:本文提到的无状态指的是无需session完毕认证.取用户封装信息. 无状态的优点: 1.多应用单点登录:在多应用的时候仅仅需在登录server登录后.各子应用无需再次登录. 2.多server集群:无需制作会话共享的缓存就可以实现. 此方案的缺点: 1,依赖于cookie,尽管如今主流浏览器都支持cookie. 2.单点登录须要各子应用属于同一主域名下(跨主域名无法实现). 实现原理: 登录时封装用户信息,并将用户信息通过序列化加密写到用户cookie.当用户下次请求应用server时,过滤

http协议的无状态性及基于memcached-session-manager构建tomcat cluster会话服务器

一.http协议的无状态性 1.HTTP协议一共有五大特点 1)支持客户/服务器模式 2)简单快速 当客户端向服务器端发送请求时,只是简单的填写请求路径和请求方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了.比较常用的请求方法有三种,分别是:GET.HEAD.POST.不同的请求方法使得客户端和服务器端联系的方式各不相同.因为HTTP协议比较简单,所以HTTP服务器的程序规模相对比较小,从而使得通信的速度非常快. 3)灵活 Http协议允许客户端和服务器端传输任意类型任意格式的数据对象