NHibernate 如何在并行线程下,使用session
第一,你要知道,并行线程会有一个蛋疼的地方。他不会每次执行都给你去开一个线程。
我一开始以为每次执行都会去开一个新的线程。。。。
list.AsParallel().ForAll(memberInfo =>
{
Console.WriteLine(Thread.GetCurrentProcessorId());
}
result

这就导致,如果我们在当前线程上下文绑定了sessionFactory就会导致,重用线程会获取到一样的session
如果在前面一个线程中我们关闭了session 就会导致后来获取到的session失效。
第一个, 我们首先去配置 SessionFactory
NHibernate.Cfg.Configuration的实例化对象Configuration
设置SessionFactory的配置属性
Configuration.SetProperty("current_session_context_class", "thread_static"); //每个线程获取到的session是不一样的。
然后更改获取session的方法
当然要在方法外部设置一个静态的session 并且要带上线程静态的标签,那么每个线程获取的去获取的时候是原来的那一个,这就涉及到关闭了
[ThreadStatic]
private static ISession Session; public ISession OpenCurrentSession()
{
try
{
if(CurrentSessionContext.HasBind(SessionFactory))
{
Session = SessionFactory.GetCurrentSession();
}
else
{
Session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(Session);
}
return Session;
}
catch
{
throw;
}
}
关闭session方法
public void CloseCurrentSession()
{
try
{
//一定要线程上下文解绑 否则重用线程将会取到已经关闭的session
CurrentSessionContext.Unbind(Session.SessionFactory);
Session.Close();
Session.Dispose();
}
catch
{
throw;
}
}
//至于查询方法 ,你可以把你的sessionFactory使用 单例,
然后重ioc容器中去取
list.AsParallel().ForAll(memberInfo =>
{
Console.WriteLine(Thread.GetCurrentProcessorId());
var session = appSessionFactory.OpenCurrentSession();
//这里进行查询 我不建议在这里取使用更新删除插入操作,很容易出问题
appSessionFactory.CloseCurrentSession();
});
这个并行线程使用session 就差不多完了。
一般用于多个去做一件事的时候可以用到并行线程,比如我需要集合中的每个元素都要去查数据库,如果用for循环,会非常慢,如果用并行,将会非常快。
NHibernate 如何在并行线程下,使用session的更多相关文章
- C#线程 并行线程
第五部分 并行线程 在本节中,我们将介绍Framework 4.0新增的利用多核处理器的多线程API: 并行LINQ或PLINQ Parallel 类 任务并行性构造 并发集合 自旋锁和自旋等待 ...
- 远程线程注入突破SESSION 0
远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...
- 一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.分布式架构下,Session共享有什么方案 2.简述你对RPC.RMI的理解 3.分布式id生成方案 4.分布式锁解决 ...
- [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)
[.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下) 本篇导读: 接上篇继续介绍SVN的高级功能,即使用分支并行开发.随着需求的不断变更,新功能的增加.特别是 ...
- Delphi Socket 阻塞线程下为什么不触发OnRead和OnWrite事件
//**********************************************************************************//说明: 阻塞线程下为什么不触 ...
- Asp.net默认配置下,Session莫名丢失的原因及解决
Asp.net默认配置下,Session莫名丢失的原因及解决 我们平时写的asp.net程序,里面要用到Session来保存一些跨页面的数据.但是Session会经常无故丢失,上网查查,也没找到原因. ...
- 解决ashx文件下的Session“未将对象引用设置到对象的实例”
using System; using System.Collections.Generic; using System.Linq; using System.Web; using PPT_DAL; ...
- 微服务架构下分布式Session管理
转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”. 一.应用架构变 ...
- 用redis实现TOMCAT集群下的session共享
上篇实现了 LINUX中NGINX反向代理下的TOMCAT集群(http://www.cnblogs.com/yuanjava/p/6850764.html) 这次我们在上篇的基础上实现session ...
随机推荐
- git详细介绍
Git管理我们的代码会经历三个不过程 1. 工作区:没有提交的代码就是存放的工作区 2. 暂存区:通过 git add 文件名 命令提交代码该文件就放在暂存区 3. 历史区:通过 git commit ...
- box-shadow阴影覆盖问题
“商品库”栏下方阴影被覆盖,解决方法:给“商品库”盒子加“position:relative”
- Django学习手册 - csrf
CSRF csrf原理 无csrf时存在隐患 Form提交 Ajax提交 默认为全局都csrf Form表单提交方式: <div> <form action="/login ...
- java实现在线浏览PDF文档功能
实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...
- vue 学习笔记—Es6
// 第一部分 /* console.log(a+'c'); var a = 1; console.log(b+'c'); let b =1; */ // 上述代码 left定义报错 原因: /* v ...
- mac 电脑连接linux 服务器
Mac 电脑下连接Linux服务器 命令: ssh -p 端口号(22) 用户名@ip OK,输入密码,搞定
- Angular 创建组件
创建组件 0 命令创建 1 创建组件 定义hello.component.ts组件 在app.module.ts中引用并添加到declarations声明中 在app.component.html中使 ...
- 【转】数据库介绍(MySQL安装 体系结构、基本管理)
[转]数据库介绍(MySQL安装 体系结构.基本管理) 第1章 数据库介绍及mysql安装 1.1 数据库简介 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新 ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- linux 用户空间获得纳秒级时间ns【转】
转自:https://www.cnblogs.com/kekukele/p/3662816.html 一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下l ...