新社区网站

通常,你会在正确的地方,但我们最近推出了一个全新的社区网站……为社区,受社区。

耶……带我去社区!

社区博客是社区成员的个人观点,绝不是DNN公司或DNN平台的官方立场。这是一个表达个人对DNNPlatform、社区及其生态系统的想法的地方。你有什么有用的信息想要与DNN社区分享吗?如果有,请联系

社区博客的使用由我们的社区博客指南-请在评论或发布之前阅读。


DNN 5中的缓存

DotNetNuke 5.0中隐藏的亮点之一是CBO(自定义业务对象)类中的新缓存支持。在为寒武纪版本重构DotNetNuke期间,缓存是被密切关注的事情之一,因为缓存开始在DNN 4中引起主要问题。x分支。

让我们来看看DNN 4中的缓存是如何完成的:

公共共享函数GetSecureHostSettings ()作为哈希表昏暗的h作为哈希表h =CType加上了DataCache(。GetCache (“GetSecureHostSettings”)、散列表)如果h没有什么然后h =哈希表昏暗的SettingName作为字符串昏暗的博士作为IDataReader = DataProvider.Instance().GetHostSettingsdr.Read ()如果Convert.ToBoolean博士((2))然后setingname = dr.GetString(0)如果SettingName.ToLower.IndexOf (“密码”) = -1然后如果dr.IsDBNull (1)然后h.Add (SettingName dr.GetString (1))其他的h.Add (SettingName”“结束如果结束如果结束如果结束加上了DataCache dr.Close()。SetCache (“GetSecureHostSettings”h)结束如果返回h结束函数

这是DNN 4.9.3中DotNetNuke.Entities.Host.HostSettings类的代码。事实上,这是在dnn3的整个应用程序中使用的模式。X - 4.x。这种模式的问题是,它不是完全线程安全的,特别是在较大的例程中使用时,特别是在大型和繁忙的站点上。当您想要使用从缓存中获得的对象时,可能有可能从缓存中删除该对象。

在DotNetNuke 5。x版本中,CBO类增加了一个新的缓存功能:

公共共享函数GetCachedObject (TObject) (按值传递cacheItemArgs作为CacheItemArgs,按值传递cacheItemExpired作为CacheItemExpiredCallback)作为TObject返回DataCache。GetCachedData(Of TObject)(cacheItemArgs, cacheItemExpired)结束函数

然后调用DataCache的一个新方法GetCachedData。这个方法看起来像这样:

公共共享函数GetCachedData (TObject) (按值传递cacheItemArgs作为CacheItemArgs,按值传递cacheItemExpired作为CacheItemExpiredCallback)作为TObject声明局部变量并尝试从缓存中检索它昏暗的objObject作为对象= GetCache (cacheItemArgs.CacheKey)昏暗的超时作为整数= cacheItemArgs。CacheTimeOut * Convert.ToInt32(host . performancessetting)'如果项目没有被缓存如果objObject没有什么然后当我们重新生成缓存时,阻止其他线程进入该块SyncLockobjLock尝试再次从缓存中检索对象(如果另一个线程在我们第一次检查后加载了该对象)objobobject = GetCache(cacheItemArgs.CacheKey)如果objObject没有什么然后使用委托从数据源获取对象objobobject = cacheItemExpired(cacheItemArgs)如果objObject不是没有什么需要说明timeOut > 0然后DataCache.SetCache (cacheItemArgs。CacheKey,objObject,cacheItemArgs.CacheDependency,缓存。NoAbsoluteExpiration, _ TimeSpan.FromMinutes(timeOut), cacheItemArgs。CachePriority cacheItemArgs.CacheCallback)检查Item是否实际保存在缓存中如果DataCache.GetCache (cacheItemArgs.CacheKey)没有什么然后昏暗的objEventLogInfo作为LogInfo objEventLogInfo。LogTypeKey = EventLogController.EventLogType.CACHE_ERROR.ToString() objEventLogInfo.LogProperties.Add()LogDetailInfo (cacheItemArgs。CacheKey,“没有了”))昏暗的objEventLog作为EventLogController () objEventLog.AddLog (objEventLogInfo)结束如果ElseIfobjObject没有什么然后返回没有什么结束如果结束如果结束SyncLock结束如果返回DirectCast(objObject TObject)结束函数

正如你所看到的,这基本上仍然与DNN 3.x/4中的“旧”模式相同。X,但是,有一些增强:

  • 线程安全。使用Synlock,可以防止其他线程在处理对象时入侵
  • 使用自动回调,当在缓存中没有找到对象时将调用该回调
  • 检查以确保对象已正确保存到缓存

作为使用新模式的一个示例,让我们看看Host。在DNN 5中修改了GetSecureHostSettings:

公共共享函数GetSecureHostSettingsDictionary ()作为词典(字符串字符串返回国会预算办公室。(GetCachedObject(字典字符串字符串)) (加上了DataCache CacheItemArgs(。SecureHostSettingsCacheKey, _ DataCache。_ DataCache.HostSettingsCachePriority), _AddressOfGetSecureHostSettingsDictionaryCallBack)结束函数

以及相应的回调函数:

私人共享函数GetSecureHostSettingsDictionaryCallBack (按值传递cacheItemArgs作为CacheItemArgs)作为对象昏暗的dicSettings作为词典(字符串字符串昏暗的博士作为IDataReader = DataProvider.Instance().GetHostSettings试一试dr.Read ()如果Convert.ToBoolean博士((2))然后昏暗的settingName作为字符串= dr.GetString (0)如果settingName.ToLower.IndexOf (“密码”) = -1然后如果dr.IsDBNull (1)然后dicSettings。添加(settingName dr.GetString (1))其他的dicSettings。添加(settingName”“结束如果结束如果结束如果结束最后如果博士没有什么然后dr.Close ()结束如果结束试一试返回dicSettings结束函数

正如您所看到的,回调函数GetSecureHostSettingsDictionaryCallBack本质上与旧方法相同,只是去掉了缓存逻辑。使用这种模式在您自己的模块中使用缓存要容易得多。只需要几行代码就可以了。

评论

评论形式

只有注册用户才能发表评论。

NewsArchives


Aderson Oliveira(22岁)
亚历克·惠廷顿(11岁)
亚历山德拉·戴维斯(3岁)
Alex Shirley(10岁)
安德鲁·霍夫林(3岁)
安德鲁·纳斯(30岁)
安迪·特里巴(1)
安东尼·格伦赖特(5岁)
安东尼奥·夏格里(28岁)
阿什·普拉萨德(37岁)
本·施密特(1)
本杰明·赫尔曼(25岁)
伯努瓦·萨顿(9岁)
贝丝·费尔堡(12岁)
比尔·沃克(36岁)
鲍勃·克鲁格(5岁)
波格丹·莱特斯库(1)
布莱恩·杜克斯(2岁)
白雪皑皑(1)
布鲁斯·查普曼(20岁)
布莱恩·安德鲁斯(1)
卡塔·康诺利(55岁)
查尔斯·纳斯(163)
克里斯·哈蒙德(第213届)
克里斯·帕特拉(55岁)
克林特·帕特森(108)
邝党(21岁)
丹尼尔·巴塞洛缪(2岁)
丹尼尔·梅特勒(181)
丹尼尔·瓦拉达斯(48岁)
戴夫·巴克纳(2岁)
大卫·波因德克斯特(12岁)
大卫·罗德里格斯(3岁)
萧耀文(1)
道格·豪厄尔(11岁)
Erik van Ballegoij(30岁)
恩斯特·彼得·塔明加(80岁)
弗朗西斯科·佩雷斯·安德烈斯(17岁)
杰夫·巴洛(12岁)
乔治·阿拉特拉什(12岁)
吉福德·沃特金斯(3)
吉尔·勒·皮戈彻(3)
伊恩·罗宾逊(7岁)
以色列·马丁内斯(17岁)
简·布洛姆奎斯特(2)
简·乔纳斯(3岁)
贾斯普雷特·巴蒂亚(1)
詹妮·梅里菲尔德(6岁)
乔·布林克曼(274)
约翰·米切尔(1)
乔恩·亨宁(14岁)
乔纳森·希利(4岁)
乔丹·库珀史密斯(1)
约瑟夫·克雷格(2岁)
马侃(1)
凯文贝吉(3岁)
凯利·福特(4岁)
肯·格里尔森(10岁)
凯文·施莱纳(6岁)
利·波因特(31岁)
洛林·杨(60岁)
Malik Khan (1)
马特·拉特利奇(2岁)
马蒂亚斯·施洛曼(16岁)
毛里西奥Márquez (5)
迈克尔·多克西(7岁)
迈克尔·托比什(3岁)
迈克尔·华盛顿(2002)
米格尔·加梅坦(3)
迈克·霍顿(19岁)
米歇尔·塞勒斯(40岁)
弥敦罗孚(3)
Navin V Nagiah(14岁)
n (31)
Nik Kalyani(14岁)
奥利弗·海因(1)
帕特里西奥·f·萨利纳斯(1)
帕特里克·瑞恩(1)
彼得·唐克(54岁)
菲利普·比德尔(135岁)
菲利普·贝克尔(4岁)
理查德·杜马斯(22岁)
罗伯特·J·柯林斯(5岁)
罗杰·塞尔温(8岁)
鲁本·洛佩兹(1)
莱恩·马丁内斯(1岁)
Sacha Trauwaen (1)
爱沙尼亚语(4)
Sanjay Mehrotra(9岁)
斯科特·麦卡洛克(1)
斯科特·施莱西尔(11岁)
斯科特·威尔金森(3岁)
斯科特·威尔海特(97岁)
塞巴斯蒂安·洛波德(80岁)
肖恩·沃克(237)
肖恩·梅哈菲(17岁)
斯蒂芬·卡尔曼(12岁)
Stefan Kamphuis(12岁)
史蒂夫·法比安(31岁)
史蒂文·费舍尔(1)
蒂莫·布鲁梅尔霍夫(24岁)
托尼·亨利克(3岁)
托斯滕·韦根(3岁)
第谷·德·沃德(4)
Vicenç Masanas(27岁)
Vincent Nguyen(3岁)
维塔利·科扎达耶夫(6岁)
威尔·摩根维克(40岁)
威尔·斯特罗尔(180岁)
威廉·塞弗伦斯(5岁)
什么是液体含量?
找出
什么是液体含量?
找出
什么是液体含量?
找出
Baidu
map