第一,你要知道,并行线程会有一个蛋疼的地方。他不会每次执行都给你去开一个线程。

我一开始以为每次执行都会去开一个新的线程。。。。

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循环,会非常慢,如果用并行,将会非常快。

最新文章

  1. Rafy 框架 - 为数据库生成注释
  2. 同一个页面多个page之间的切换
  3. 4W1T教程1 如何使用幻灯片
  4. Mutex 和 Lock
  5. android target unknown and state offline解决办法
  6. Oracle 数据库基础学习 (四) group by的使用
  7. 【poj3261】 Milk Patterns
  8. [刘阳Java]_Java环境搭建_第2讲
  9. Oracle创建表、索引、主键、字段描述
  10. EasyUI - DataGrid 组建 - [ 删除,修改 ]
  11. golang mutex互斥锁分析
  12. 详细了解 int? 类型
  13. filereader api 类型
  14. PAT乙级1065 map
  15. web页面中http返回的状态码解释
  16. NOI真题记录
  17. 工作笔记:/bin/bash^M: 坏的解释器: 没有那个文件或目录 问题解决
  18. oracle连接连表查询时,两表的连接字段类型不一致的时候,会导致ora 01722无效数字错误,这时候需要转换
  19. golang基础数据结构链表
  20. P3144 关闭农场 并查集 反向

热门文章

  1. 第20月第14天 objc_getAssociatedObject _cmd
  2. 【vue】中 provide 和 inject 的使用方法
  3. Java基础03-12_对象比较
  4. lua 语法的使用总结
  5. jQuery动态改变input框的属性
  6. javascript数据类型和常用内置对象(重要!)
  7. java语言什么时候诞生的?
  8. 注解 java.lang.annotation.Inherited 介绍
  9. python按照文件创建日期整理文件至文件夹
  10. 利用微信企业号的告警功能,联动检测ICMP的shell脚本