部署和操作 Enterprise Library 缓存应用程序块
管理员的二个主要任务是确认缓存应用程序块的初始部署是有计划且可管理的,以及确认后来的部署更新仅对已存在的使用应用程序块的应用程序产生最少的影响。本主题将解决这些问题和下列的管理任务:
-
部署缓存应用程序块
-
更新缓存应用程序块
-
度量缓存应用程序块
缓存应用程序块由多个程序集组成,属于缓存应用程序块的每个程序集的文件名都以
Microsoft.Practices.EnterpriseLibrary.Caching
开始。另外,应用程序块依赖于能用程序集和 ObjectBuilder
子系统,依赖于使用应用程序块的应用程序的配置文件。它也可能需要数据访问应用程序块程序集、安全应用程序块和加密应用程序块程序集。使用缓存应用程序块的应用程序可以部署为下列配置之一:
-
可以部署在应用程序文件夹层次中成为一个私有程序集。
-
可以部署在任何文件系统位置或者全局程序集缓存中成为共享程序集。
将缓存应用程序块部署为私有程序集
如果应用程序不需要来自全局程序集缓存的服务,缓存应用程序块就可以被部署在应用程序的目录结构中。这简化了部署,因为可以使用 xcopy 命令来在目标机器上安装整个应用程序,包括缓存应用程序块。如果在同一机器上有多个应用程序使用缓存应用程序块,可以在每个应用程序的文件夹层次中都安装一个程序块集副本。这样,每个应用程序的程序集副本就可以被独立的更新。
将缓存应用程序块部署为共享程序集
可以为缓存应用程序块签上强名称,Visual Studio .NET 和 .NET Framework SDK
中都包含了相应的工具。在程序集被强命名后,它就可以被部署在一个共享的位置而被多个应用程序所使用。可以选择部署程序集到任何文件系统位置,并在每个使用缓存应用程序块的应用程序的配置文件中添加一个
<codeBase>
元素以指定程序集的位置。对于为 Enterprise Library
签上强名称的更多信息,请参见强命名 Enterprise Library 程序集。
一个更觉的场景是将共享的程序集部署到全局程序集缓存中。在这种场景中,机器上的所有应用程序都可以使用程序集而不需要任何其他的配置。全局程序集缓存还提供了组件服务(如事务管理)和版本管理的支持。可以用下列方法之一来将程序集安装到全局程序集缓存中去:
-
使用安装程序,如 Microsoft Windows Installer 2 。
-
使用全局程序集缓存命令行实用工具( Gacutil.exe )。
-
使用 .NET 框架配置工具( Mscorcfg.msc )。
-
将程序集移动到全局程序集的文件夹中。
如果有可用的缓存应用块更新,就可以安装更新让所有应用程序使用更新后的版本。然而,如果更新的版本带来了特定应用程序的兼容性问题,就将更新的版本安装到全局程序集缓存中,然后配置某些应用程序使用更新后的版本,而其他的继续使用早期的版本。
更新私有程序集
如果缓存应用程序块程序集被部署为私有程序集,就可以用更新后的 DLL 来替换掉在应用程序文件夹层次中的早期版本的 DLL 来部署更新。
注意
要保留早期版本的副本,以在如果使用更新后的程序集出现兼容性问题时,可以用早期的版本来恢复。
更新共享程序集
更新在共享配置中的缓存应用程序块程序集最容易的方法是将更新后的 DLL 安装到全局程序集缓存中。默认情况下,通用语言运行时会尝试加载应用程序构建使用的有同样的主、次版本号,而构建和修改版本号最新的程序集。因此,如果主、次版本号没有发生变化的话,添加更新后版本到全局程序集缓存中将会自动更新所有引用缓存应用程序块程序集的应用程序。
如果主或次版本号已增加,或者如果更新的版本导致了已有应用程序的兼容问题,可以覆盖默认的版本策略。要指定使用的程序集的特定版本,编辑应用程序的配置文件的<BindingPolicy>
(用于单独的应用程序)或者机器策略文件。另一个选择是可以和一个发布商策略文件一起分发更新的程序集版本,以重定向程序集请求到更新的版本。
在应用程序的配置文件有一些用于开启/关闭度量的配置节。它们是可选的,但是它们必须同时存在或不存在。如果忽略它们,就相当于所有的值都为
false 。 <configSections>
节是指定
System.Configuration
库如何读取实际配置数据的地方,而实际数据在
<instrumentationConfiguration>
节中。设置值为 true 开启度量,设置值为
false 关闭度量。三种度量的类型是性能计数器、事件日志和 Windows Management Instrument (WMI)
事件。用于度量的配置节如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="instrumentationConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection,
Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<instrumentationConfiguration performanceCountersEnabled="true" eventLoggingEnabled="true" wmiEnabled="true" />
</configuration>
表1描述了缓存应用程序块的性能计数器。
表 7.5. 缓存应用程序块性能计数器
性能计数器 | 描述 |
---|---|
Cache Expiries/sec | 缓存中条目的到期速率。 |
Cache Hit Ratio | 缓存命中率。缓存命中发生在请求缓存的条目时。 |
Cache Hits/sec | 缓存接收到的对其包含了的条目的请求的速率。 |
Cache Misses/sec | 缓存接收到的对其没有包含的条目的请求的速率。 |
Cache Scavenged Items/sec | 从缓存中清除条目的速率。 |
Total Cache Entries | 缓存中所有条目数。 |
Total # of Cache Access Attempts | 从缓存中读取的总数。 |
Updated Entries/sec | 缓存中更新条目的速率,更新可以是 add
或 remove 。 |
速率计数器展示了随着时间的推移事件数量的增长,并定时分隔改变的值以显示活动的速率。关于性能计数器的更多信息,请参见 MSDN 中 .NET Framework 类库中的 PerformanceCounterType Enumeration 。
表1列出了缓存应用程序块事件日志实体。监听器列中的是触发事件的类,事件列中的是事件的名称,异常列中的是异常的布尔值,主消息列中的是主要错误消息,其他列中的是所有可用的附加信息。
表 7.6. 缓存应用程序块事件日志实体
监听器 | 事件 | 异常 | 主消息 | 其他 |
---|---|---|---|---|
CachingInstrumentationListener | CacheFailed | true | 在使用实例 实例名 时发生错误。 |
启动特定应用的刷新动作时失败。 |
CachingInstrumentationListener | CacheCallbackFailed | true | 执行用于实例 实例名 中的键
键 的移除回调时发生错误。 |
不适用。 |
DefaultCachingEventLogger | Configuration 错误 | true | 获取用于实例 实例名 的配置时发生错误。 |
不适用。 |
ConfigurationChangeWatcher | 错误通知了一个在配置中的修改 | 不适用 | 这是一个触发在 watcher type full nameexception message 中的错误。 |
可以用下列 Windows Management Instrument (WMI)事件对缓存应用程序块进行度量:
-
CacheFailureEvent
-
CacheCallbackFailureEvent
-
CacheScavengedEvent
-
CacheConfigurationFailureEvent
下列表格描述了每个 WMI 事件的属性。
表1 描述了 CacheFailureEvent
WMI 事件的属性。
表 7.7. CacheFailureEvent 属性
WMI 属性 | 描述 |
---|---|
ErrorMessage | 描述了失败的缓存活动的错误消息。 |
ExceptionMessage | 用于在缓存活动失败时触发的异常的消息。 |
InstanceName | 遭受失败的缓存管理器的 ID,就是在配置文件中指定的名称。 |
UtcTimeStamp | 缓存活动失败的时间。 |
表2描述了 CacheCallbackFailureEvent
WMI
事件的属性。
表 7.8. CacheCallbackFailureEvent 属性
WMI 属性 | 描述 |
---|---|
Key | 到期的条目的键。 |
ExceptionMessage | 在通知应用程序条目到期的回调失败时触发的异常的消息。 |
InstanceName | 遭受失败的缓存管理器的 ID,就是在配置文件中指定的名称。 |
UtcTimeStamp | 回调失败发生的时间。 |
表3描述了 CacheScavengedEvent
WMI 事件的属性。
表 7.9. CacheScavengedEvent 属性
WMI 属性 | 描述 |
---|---|
ItemsScavenged | 从缓存中清理的条目的数量。 |
InstanceName | 条目将被清理的缓存管理器的 ID,就是在配置文件中指定的名称。 |
UtcTimeStamp | 清理事件触发的时间。 |
表4描述了 CacheConfigurationFailureEvent
WMI
事件的属性。