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 ...
随机推荐
- luogu P2520 [HAOI2011]向量
传送门 一堆人说数论只会gcd,我连gcd都不会,菜死算了qwq Orzyyb 这题欺负我数学不好qwq 首先可以发现实际上有如下操作:x或y±2a,x或y±2b,x+a y+b,x+b y+a(后面 ...
- Spark思维导图之内存管理
- LinkedHashMap实现LRU缓存算法
LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素. 构造函数如下: public LinkedHashMap ...
- Kotlin数据模型
Java中的常用的Bean类,每一个变量我们都需要写getter,setter方法,却都要手动实现很多方法: 尽管可以用工具帮我们完成,但是代码显得很臃肿,不灵活. 特别是当我们需改其中某一个成员的时 ...
- 《jQuery精品教程视频》-每天的复习笔记
第一天 //jquery:简单.粗暴 //jq和js的关系 //js是什么? js是一门编程语言 //jq仅仅是基于js的一个库,jq可理解为就是开发js的一个工具. //概念 //1. 为什么要学j ...
- Microsoft SQL - 学习总目录
Microsoft SQL - 数据库管理系统 Microsoft SQL - 数据类型 Microsoft SQL - 查询与更新 Microsoft SQL - 操作语句 Microsoft SQ ...
- CMakeLists 链接库相关指令
set(LSTAR_DIR "$ENV{HOME}/LStar_build") include_directories(${LSTAR_DIR}) LINK_DIRECTORIES ...
- Intel Xeon E5-2620 v4参数
基本参数 CPU系列 Xeon E5 v4系列 制作工艺 14纳米 核心代号 Broadwell 性能参数 核心数量 八核心 线程数量 十六线程 CPU主频 2.1GHz 动态加速频率 3GHz L3 ...
- c++从文件路径获取目录
场景 c++从文件路径获取目录 实现代码 初始化是不正确的,因为需要转义反斜杠: string filename = "C:\\MyDirectory\\MyFile.bat"; ...
- 查询tensorflow中的函数用法
一下均在ubuntu环境下: (1)方法一,使用help()函数: 比如对于tf.placeholder(),在命令行中输入import tensorflow as tf , help(tf.plac ...