当前位置: 网学 > 编程文档 > 其他类别 > 正文

线程共享的DbContext与私有的DbContext

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/12
我们在实现项目开发中,可能用第二种比较多,即

  1. DataClasses1DataContext db=new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString()) 

这样,在开发环境与生成环境只要配置一个CONFIG文件即可。灵活。

而今天的主题是线程共享的DbContext与私有的DbContext,所以开始书归正转了,对于ado.net架构中,我们往往使用一个static全局对象来完成数据访问工作,而在linq to sql中,如果你建立一个static对象,它会出现很多问题,这在实现开发过程中才可以体会到,所以,今天要说的不是static对象。

一 线程共享的DbContext,说清楚一点就是在一个线程内,你的DataContext对象是共享的,是一个对象,不是new出很多个datacontext对象来,这事实上是一种单例模式的体现,这没有问题,它解决了static对象所产生的问题,而又满足了多表关联查询时出现(不能实现不同数据上下文件的引用,linq to sql和Ef都是这样的)的问题。

代码:

datacontext生成工厂:

  1. /// <summary>  
  2.      /// 数据库建立工厂  
  3.      /// Created By : 张占岭  
  4.      /// Created Date:2011-10-14  
  5.      /// Modify By:  
  6.      /// Modify Date:  
  7.      /// Modify Reason:  
  8.      /// </summary>  
  9.      internal sealed class DbFactory  
  10.      {  
  11.          #region Fields  
  12.          static System.Timers.Timer sysTimer = new System.Timers.Timer(10000);  
  13.          volatile static Dictionary<Thread, DbContext[]> divDataContext = new Dictionary<Thread, DbContext[]>();  
  14.          #endregion  
  15.    
  16.          #region Constructors  
  17.          /// <summary>  
  18.          /// 类构造方法  
  19.          /// </summary>  
  20.          static DbFactory()  
  21.          {  
  22.              sysTimer.AutoReset = true;  
  23.              sysTimer.Enabled = true;  
  24.              sysTimer.Elapsed += new System.Timers.ElapsedEventHandler(sysTimer_Elapsed);  
  25.              sysTimer.Start();  
  26.          }  
  27.          #endregion  
  28.    
  29.          #region  Static Methods  
  30.    
  31.          /// <summary>  
  32.          /// 订阅Elapsed事件的方法  
  33.          /// </summary>  
  34.          /// <param name="sender"></param>  
  35.          /// <param name="e"></param>  
  36.          static void sysTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  37.          {  
  38.              List<Thread> list = divDataContext.Keys.Where(item => item.ThreadState == ThreadState.Stopped).ToList();  
  39.              for (int index = 0; index < list.Count; index++)  
  40.              {  
  41.                  for (int refer = 0; refer < divDataContext[list[index]].Length; refer++)  
  42.                      if (divDataContext[list[index]][refer] != null)  
  43.                      {  
  44.                          divDataContext[list[index]][refer].Dispose();  
  45.                          divDataContext[list[index]][refer] = null;  
  46.                      }  
  47.                  divDataContext.Remove(list[index]);  
  48.                  list[index] = null;  
  49.              }  
  50.          }  
  51.          /// <summary>  
  52.          /// 通过工厂的制造模式获取相应的LINQ数据库连接对象  
  53.          /// </summary>  
  54.          /// <param name="dbName">数据库名称(需要与真实数据库名称保持一致)</param>  
  55.          /// <returns>LINQ数据库连接对象</returns>  
  56.          public static DbContext Intance(string dbName)  
  57.          {  
  58.              return Intance(dbName, Thread.CurrentThread, 10);  
  59.          }  
  60.    
  61.          /// <summary>  
  62.          /// 通过工厂的制造模式获取相应的LINQ数据库连接对象  
  63.          /// </summary>  
  64.          /// <param name="dbName"></param>  
  65.          /// <param name="dbCount"></param>  
  66.          /// <param name="dbIndex"></param>  
  67.          /// <returns></returns>  
  68.          public static DbContext Intance(string dbName, int dbCount, int dbIndex)  
  69.          {  
  70.              return Intance(dbName, Thread.CurrentThread, dbCount, dbIndex);  
  71.          }  
  72.    
  73.          /// <summary>  
  74.          /// 通过工厂的制造模式获取相应的LINQ数据库连接对象  
  75.          /// </summary>  
  76.          /// <param name="dbName">数据库名称(需要与真实数据库名称保持一致)</param>  
  77.          /// <param name="thread">当前线程引用的对象</param>  
  78.          /// <param name="dbCount">linq to sql数据库数量</param>  
  79.          /// <param name="dbIndex">当前索引</param>  
  80.          /// <returns>LINQ对象上下文</returns>  
  81.          public static DbContext Intance(string dbName, Thread thread, int dbCount, int dbIndex)  
  82.          {  
  83.              if (!divDataContext.Keys.Contains(thread))  
  84.              {  
  85.                  divDataContext.Add(thread, new DbContext[dbCount]);  
  86.              }  
  87.              if (divDataContext[thread][dbIndex] == null)  
  88.              {  
  89.                  divDataContext[thread][dbIndex] = new DbContext(dbName);  
  90.              }  
  91.              return divDataContext[thread][dbIndex];  
  92.          }  
  93.    
  94.          /// <summary>  
  95.          /// 通过工厂的制造模式获取相应的LINQ数据库连接对象  
  96.          /// </summary>  
  97.          /// <param name="dbName"></param>  
  98.          /// <param name="thread"></param>  
  99.          /// <returns></returns>  
  100.          public static DbContext Intance(string dbName, Thread thread)  
  101.          {  
  102.              return Intance(dbName, thread, 10);  
  103.          }  
  104.          #endregion  
  105.    
  106.      } 

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号