经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
NHibernate 如何在并行线程下,使用session
来源:cnblogs  作者:无语1994  时间:2018/9/25 20:42:45  对本文有异议

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

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

  1. list.AsParallel().ForAll(memberInfo =>
  2. {
  3. Console.WriteLine(Thread.GetCurrentProcessorId());
  4. }

result

这就导致,如果我们在当前线程上下文绑定了sessionFactory就会导致,重用线程会获取到一样的session

如果在前面一个线程中我们关闭了session 就会导致后来获取到的session失效。

第一个, 我们首先去配置 SessionFactory

NHibernate.Cfg.Configuration的实例化对象Configuration

设置SessionFactory的配置属性

  1. Configuration.SetProperty("current_session_context_class", "thread_static"); //每个线程获取到的session是不一样的。

然后更改获取session的方法

当然要在方法外部设置一个静态的session  并且要带上线程静态的标签,那么每个线程获取的去获取的时候是原来的那一个,这就涉及到关闭了

  1. [ThreadStatic]
  2. private static ISession Session;
  3. public ISession OpenCurrentSession()
  4. {
  5. try
  6. {
  7. if(CurrentSessionContext.HasBind(SessionFactory))
  8. {
  9. Session = SessionFactory.GetCurrentSession();
  10. }
  11. else
  12. {
  13. Session = SessionFactory.OpenSession();
  14. CurrentSessionContext.Bind(Session);
  15. }
  16. return Session;
  17. }
  18. catch
  19. {
  20. throw;
  21. }
  22. }

关闭session方法 

  1. public void CloseCurrentSession()
  2. {
  3. try
  4. {
  5. //一定要线程上下文解绑 否则重用线程将会取到已经关闭的session
  6. CurrentSessionContext.Unbind(Session.SessionFactory);
  7. Session.Close();
  8. Session.Dispose();
  9. }
  10. catch
  11. {
  12. throw;
  13. }
  14. }

//至于查询方法 ,你可以把你的sessionFactory使用 单例,

然后重ioc容器中去取

  1. list.AsParallel().ForAll(memberInfo =>
  2. {
  3. Console.WriteLine(Thread.GetCurrentProcessorId());
  4. var session = appSessionFactory.OpenCurrentSession();
  5. //这里进行查询 我不建议在这里取使用更新删除插入操作,很容易出问题
  6. appSessionFactory.CloseCurrentSession();
  7. });

这个并行线程使用session 就差不多完了。

一般用于多个去做一件事的时候可以用到并行线程,比如我需要集合中的每个元素都要去查数据库,如果用for循环,会非常慢,如果用并行,将会非常快。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号