慎把“DataContext”静态化 或则单例_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 慎把“DataContext”静态化 或则单例

慎把“DataContext”静态化 或则单例

 2013/11/26 17:27:27  Loui  博客园  我要评论(0)
  • 摘要:之前在项目里由于把DataContext静态化,最后在测试阶段发现了很多奇怪的问题,后来经过同事的指点然后上网搜了一翻终于发现MSDN上说:"请不要试图重用DataContext的实例。DataContextmaintainsstate(includinganidentitycache)foroneparticularedit/querysession.'>每个DataContext都会保持对应一个特定编辑/查询会话的状态(包括标识缓存)。DataContext.'>
  • 标签:

 之前在项目里由于把DataContext静态化,最后在测试阶段发现了很多奇怪的问题,后来经过同事的指点 然后上网搜了一翻终于发现

MSDN上说:   "请不要试图重用 DataContext 的实例。DataContext maintains state (including an  identity cache) for one particular edit/query session.'>每个 DataContext  都会保持对应一个特定编辑/查询会话的状态(包括标识缓存)。DataContext.'>若要获取基于数据库当前状态的新实例,请使用新的 DataContext" 博客园上说: 不要将DataContext单例化

单个DataContext最大的问题就是SubmitChanges造成当前线程和数据库的数据不同步。DataContext不是线程安全的对象,由于它会缓存所有的数据操作,当A线程的数据修改到一半,它可能被B线程在调用SubmitChanges时提交了,这个问题在开发时不容易被发现。之前我在项目中用了单例模式创建DataContext,导致出现用户反应“为什么我在这篇文章的评论会跑到别的文章下面去了?!”之类的问题,正是因为这个原因。DataContext是LINQ  to SQL框架的主入口点,它拥有所有表的映射让我觉得会占用很多资源,所以我用单例模式创建它。有人通过分析源代码得出结论:“DataContext并没有占用多么庞大的资源,无非就是一个DbConnection和一些映射对象而已。”,我才知道那只是映射,没有任何数据。MSDN上也提示:“请不要试图重用DataContext的实例。每个DataContext都会保持对应一个特定编辑/查询会话的状态(包括标识缓存)。若要获取基于数据库当前状态的新实例,请使用新的DataContext。”

因此,DataContext是不应该被单例化或是静态化的。DataContext是轻量级的资源,创建它不需要很大的开销,最佳实践是为每个操作创建新的DataContext实例。

 

  • 相关文章
发表评论
用户名: 匿名