开发人员都喜欢 ASP.NET 应用程序缓存。 一个原因是 ASP.NET 能够在放入缓存中的项与文件系统中的文件之间创建相关性。 如果相关性所针对的文件更改,ASP.NET 会自动将相关项从缓存中删除。 通过与缓存删除回叫(当缓存项删除时向所有关注方广播通知)结合,缓存相关性为开发人员提供了方便,使他们得以通过尽量减少耗时的文件访问来最大限度地提高性能,因为这使他们可以放心地允许文件数据缓存,而不必担心数据变得陈旧。
尽管缓存相关性非常实用,但是在 ASP.NET 1.0 中还缺乏一项至关重要的功能,这项功能一旦存在,将会使缓存相关性随着开发人员的美梦成真而得到证明。 这项功能就是对数据库实体的支持。 在现实情况中,大多数 Web 应用程序都是从数据库中提取数据,而不是从文件中提取数据。 尽管 ASP.NET 能够非常出色地将缓存项链接到文件,但无法将缓存项链接到数据库实体。 也就是说,可以将文件内容读入 DataSet 中,然后缓存 DataSet,并使 DataSet 在初始化时所在的文件更改时自动从缓存中删除。 但是,无法使用数据库查询来初始化 DataSet,因此也就无法缓存 DataSet 并使 DataSet 自动在数据库更改时废弃。 这确实太糟糕了,因为正是由于数据库访问过多(例如,文件 I/O 过多)而导致应用程序性能下降。
ASP.NET 不支持数据库相关性并不意味着数据库相关性不可能实现。 这一部分 Wicked Code 展示了扩展 ASP.NET 应用程序缓存以支持数据库相关性的技术。 它包含数据库触发器及扩展存储过程。 尽管这里展示的实现仅适用于 Microsoft? SQL Server?,但是大体技术也适用于支持与文件系统交互的触发器和用户定义过程的任何数据库。
活动的数据库相关性 先看一个演示。
图 1 包含 ASP.NET 页的源代码,该 ASP.NET 页显示从名为 Quotes 的 SQL Server 数据库中随机选择的语录。 要创建数据库,请运行安装脚本。
将 Global.asax 和 SmartDBQuotes.aspx 部署到 Web 服务器上的虚拟目录(例如,wwwroot)中。
在浏览器中请求 SmartDBQuotes.aspx。 将页面刷新若干次,直到“The use of COBOL cripples the mind; its teaching should therefore be regarded as a criminal offense”语录出现。
使用 SQL Server 企业管理器或您选择的工具在 Quotes 数据库的 Quotations 表中修改该语录。 将它更改为“The use of Visual Basic? enriches the mind; its teaching should therefore not be regarded as a criminal offense”。 然后刷新该页,直到修改后的语录出现。 请注意,出现的是新语录而不是旧语录,尽管查询结果现在存储在应用程序缓存中。
刚才展示了 ASP.NET 应用程序缓存现在可以与数据库相关性结合起来,从而产生高效率的数据驱动应用程序。 问题是怎样才能将两者结合起来呢? 怎样在缓存的 DataSet 与数据库之间形成链接,以及解决方案的可伸缩性如何呢?