快速业务通道

扩展ASP.NET 2.0资源提供程序模型(2)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
w new DataException(String.Format(Thread.CurrentThread.CurrentUICulture, Properties.Resources.RM_DuplicateResourceFound, resourceKey));
 }
 return resourceValue;
}

作为一种选择,资源回退也可以封装在存储过程或 SQL CLR 组件之中 — 因为回退的规则在某种程度上可能与数据库设计相结合,因此其对于业务层而言就不是特别重要。

资源缓存

采用默认的提供程序模型,在从资源程序集中提取资源时,会加载一次程序集并将其缓存在应用程序域中。对于数据库资源,我们必须实现自己的缓存机制以避免每次单个请求资源都要针对数据库。DBResourceProvider 会处理此任务。

先前,我讲述了在没有缓存的情况下提供程序的 GetObject() 实现的情形。下列代码为使用一个对数据访问层的调用从数据库中检索资源。

 resourceValue = m_dalc.GetResourceByCultureAndKey(culture, resourceKey);

请记住,每个资源类型均存在一个单独的提供程序实例,并且该实例已被缓存以供反复使用。在提供程序内部,如果我们在字典中为每一个请求的区域缓存资源条目,则这些字典条目会通过提供程序缓存到内存之中。检索对象的代码可能首先针对此值查找字典缓存,如果没有找到,则在从数据库中检索该值之后创建一个缓存条目。结果显示如下。

string resourceValue = null;
Dictionary<string, string> resCacheByCulture = null;
if (m_resourceCache.ContainsKey(culture.Name))
{
 resCacheByCulture = m_resourceCache[culture.Name];
 if (resCacheByCulture.ContainsKey(resourceKey))
 {
resourceValue = resCacheByCulture[resourceKey];
 }
}
if (resourceValue == null)
{
 resourceValue = m_dalc.GetResourceByCultureAndKey(culture, resourceKey);
 lock(this)
 {
if (resCacheByCulture == null)
{
 resCacheByCulture = new Dictionary<string, string>();
 m_resourceCache.Add(culture.Name, resCacheByCulture);
}
 resCacheByCulture.Add(resourceKey, resourceValue);
 }
}
return resourceValue;

缓存是在数据库中存储资源时保证执行性能的一个必要环节。在本例中,这些值将被缓存直至应用程序域被释放为止,这表明对数据库中资源的动态更新在运行时不会受到影响,除非您重启应用程序。为允许此类型的动态更新,必须进行缓存资源(这些资源与数据库缓存有依赖关系)的其他工作。

线程安全

在 Web 环境下我们考虑的另一件事情是线程安全。使用 .NET 同步技术所设计的数据库提供程序模型中的组件(如图 4 所示)是线程安全的。

某特定资源类型的 DBResourceProvider 或 StringResourcesDALC 实例可以由多线程(简单的情况如同一页面的两个请求)调用。在 StringResourcesDALC 组件中,从数据库中检索数据的公共方法修改了类型的实例变量,包括打开连接、设置查询参数值和执行 SqlDataReader。为使这些功能线程安全,已应用了 MethodImplAttribute。

[MethodImpl(MethodImplOptions.Synchronized)]

该属性在方法调用期间锁定 StringResourcesDALC 对象,阻止其他调用者调用。如果缓存了资源,则不会调用数据访问组件,因此性能得到增强。

在 DBResourceProvider 中,会使用一个传统的锁定语句将对目录缓存的修改也锁定。

 lock(this)
  { ... }

在先前部分中已显示了此缓存代码的扩展视图。锁定语句会在代码阻塞期间锁定整个对象及其成员。这表明一次仅有一个线程可以向缓存中添加值。

使用自定义资源提供程序

过去,我们经常为每一资源类型手动编写 ResourceManager 的实例化和生存期管理代码。利用 ASP.NET 2.0,资源提供程序模型会替我们处理这些工作,根据需要创建和缓存资源提供程序,只要我

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号