61使用SQL Cache DependenciesWord文件下载.docx
《61使用SQL Cache DependenciesWord文件下载.docx》由会员分享,可在线阅读,更多相关《61使用SQL Cache DependenciesWord文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
该表有3列:
tableName,notificationCreated,和changeId.对于哪些在web应用程序的SQLcachedependency里要用到的表,该表都有一条记录与之对应。
tableName就是具体某个表的名称;
notificationCreated指明了添加记录时的date和time;
而列changeId的类型是int,初始值是0,每当对应的表发生一次改动,其值就自动增加一次。
除了表AspNet_SqlCacheTablesForChangeNotification外,数据库还需要为出现在SQLcachedependency里的每个表包含一个触发器(triggers),任何时候,只要表插入、更新、删除一条记录或在表AspNet_SqlCacheTablesForChangeNotification里的对应的changeId值增大的情况下就会执行触发器。
当使用SqlCacheDependency对象(object)来缓存数据时,ASP.NET将关注某个表的当前(current)的changeId值,一旦发现当前其值与数据库里面的changeId值不同时,就将该SqlCacheDependency对象清除。
因为,changeId不吻合就意味着在完成数据缓存后,表又发生过改动。
第一步:
考察命令行程序aspnet_regsql.exe
如上所述,使用polling方法时,必须对数据库进行设置以包含这些基础构造:
一个预先定义的表(AspNet_SqlCacheTablesForChangeNotification),一些存储过程,以及基于在SQLcachedependencies里要用到的表的触发器。
诸如这些表、存储过程、触发器等都可以通过命令行程序aspnet_regsql.exe来创建,该命令位于$WINDOWS$/Microsoft.NET/Framework/version文件夹。
要创建表AspNet_SqlCacheTablesForChangeNotification以及相关的存储过程,可以在命令行这样运行:
/*ForSQLServerauthentication...*/
aspnet_regsql.exe-Sserver-Uuser-Ppassword-ddatabase-ed
/*ForWindowsAuthentication...*/
aspnet_regsql.exe-Sserver-E-ddatabase-ed
注意:
要运行这些命令,必须以db_securityadmin和db_ddladmin的身份登录数据库,更多详情请参阅作者博客:
比如:
在Windows身份认证模式下,对某个数据库服务器ScottsServer里的数据库pubs添加基础构造时,在命令行键入:
aspnet_regsql.exe-SScottsServer-E-dpubs-ed
完成了数据库级(database-level)基础构造的添加后,我们需要添加触发器,再次使用aspnet_regsql.exe命令,不过用-t来指定"
表名"
(tablename),且将-ed替换为-et,如下:
aspnet_regsql.exe-S<
i>
server<
/i>
-U<
user<
-P<
password<
-d<
database<
-t<
tableName<
-et
-E-d<
要对ScottsServer里的表authors和titles添加触发器,这样做:
aspnet_regsql.exe-SScottsServer-E-dpubs-tauthors-et
aspnet_regsql.exe-SScottsServer-E-dpubs-ttitles-et
就本文而言,我们要对表Products,Categories,和Suppliers添加触发器,具体的命令在第三步探讨。
第二步:
在文件夹App_Data里引用一个MicrosoftSQLServer2005Express版的数据库
我们刚刚说过,为了添加必要的基础构造,aspnet_regsql.exe命令需要用到数据库和服务器的名称。
但是对于放在文件夹App_Data里的一个MicrosoftSQLServer2005Express的数据库而言,它的数据库名和服务器名又是什么呢?
犯不着探究其数据库名和服务器名到底是什么,我发现最简单的方法是用SQL服务管理器(SQLServerManagementStudio)来将该数据库认作localhost/SQLExpressdatabase数据库,并重新命名。
如果你的机器里已经安装了SQLServer2005完整版,自然也就安装了SQL服务管理器。
如果你安装的是Express版本的话,你可以免费下载MicrosoftSQLServerManagementStudioExpressEdition.
(
首先,关闭VisualStudio,然后打开SQLServerManagementStudio,在WindowsAuthentication模式里选择连接到localhost/SQLExpress.
图1:
连接到localhost/SQLExpressServer
连接到服务器后,管理器将显示服务器,并将数据库、安全等以折叠的形式显示出来。
在数据库文件夹上右击,选添加(Attach)项,这样将弹出AttachDatabases对话框(见图2),点Add按钮,选择我们的web应用程序的App_Data文件夹里的NORTHWND.MDF数据库。
图2:
选App_Data文件夹里的NORTHWND.MDF数据库
这样将会把数据库添加到Databases文件夹,且数据库的名称可能是该数据库文件的绝对路径(fullpath).出于简便的原则,我们将其重命名为一个更友好(human-friendly)的名字,我将其命名为“DataTutorials”.
图3:
将新添加的数据库重命名
第三步:
对Northwind数据库添加Polling基础构造
现在我们添加了App_Data文件夹里的NORTHWND.MDF数据库,让我们添加polling基础构造吧,假定你已经将数据库重命名为“DataTutorials”,运行如下的命令:
aspnet_regsql.exe-Slocalhost/SQLExpress-E-dDataTutorials-ed
aspnet_regsql.exe-Slocalhost/SQLExpress-E-dDataTutorials-tProducts-et
aspnet_regsql.exe-Slocalhost/SQLExpress-E-dDataTutorials-tCategories-et
aspnet_regsql.exe-Slocalhost/SQLExpress-E-dDataTutorials-tSuppliers-et
完成上述4个命令后,在ManagementStudio里右击数据库,进入任务子菜单(Taskssubmenu),选分派(Detach)。
然后关闭ManagementStudio并重新打开VisualStudio.
打开VisualStudio后,在服务器资源管理器里展开数据库,你可以看到有新增的表(AspNet_SqlCacheTablesForChangeNotification),新的存储过程,以及对应于表Products,Categories,和Suppliers的触发器.
图4:
数据库包含了必需的Polling基础构造
第四步:
设置Polling服务
完成上述步骤后,最后我们需要设置polling服务。
这要用到Web.config文件,在里面指定要用到的数据库,以及检测频率(pollingfrequency),单位为毫秒。
下面的代码是每隔1秒对Northwind数据库检测一次。
<
?
xmlversion="
1.0"
>
configuration>
<
connectionStrings>
addname="
NORTHWNDConnectionString"
connectionString=
"
DataSource=./SQLEXPRESS;
AttachDbFilename=|DataDirectory|/NORTHWND.MDF;
IntegratedSecurity=True;
UserInstance=True"
providerName="
System.Data.SqlClient"
/>
/connectionStrings>
system.web>
...
!
--ConfigurethepollingserviceusedforSQLcachedependencies-->
caching>
sqlCacheDependencyenabled="
true"
pollTime="
1000"
>
databases>
NorthwindDB"
connectionStringName="
/>
/databases>
/sqlCacheDependency>
/caching>
/system.web>
/configuration>
在<
add>
元素里的name值(“NorthwindDB”)是一个易读(human-readable)的名称,它与某个具体的数据库对应。
当使用SQLcachedependencies的时候,我们需要引用在这里定义的数据库名。
我们将在第六步考察怎样使用SqlCacheDependencyclass类来缓存数据。
一旦确定了一个SQLcachedependency后,检测系统(pollingsystem)每隔定义的pollTime那么多毫秒对<
元素里的数据库进行连接,并执行名为AspNet_SqlCachePollingStoredProcedure的存储过——该存储过程是我们在第三步使用aspnet_regsql.exe命令行工具添加的,它返回的是表AspNet_SqlCacheTablesForChangeNotification里的每条记录的tableName和changeId值。
那些“过时”的SQLcachedependencies将会从内存清除掉。
应在权衡性能和数据刷新(datastaleness)的基础上设置pollTime.较小的pollTime值虽然导致请求数据库的次数增加,但能更快的将“过时"
的数据清除掉;
较大的pollTime值虽然减少了对数据库的请求次数,但增加了“过时”的缓存条目的呆滞时间。
还好,对数据库的请求只是执行一个简单的存储过程而已,该存储过程仅仅从一个简单的表返回很少的几行。
你最好多测试几个不同的pollTime值,在平衡数据库访问和数据刷新2方面的情况下找出一个理想的值。
pollTime值最小允许为500.
在上面的代码里,我们在<
sqlCacheDependency>
元素里指定了一个单一的pollTime值。
其实你也可以在<
元素里随意的指定一个pollTime值。
当你指定了很多个数据库,且你想为每个数据库都指定一个检测频率(pollingfrequency)时,这样做很有用。
第五:
声明SQLCacheDependencies
在第一到第四步骤,我们探讨了如何建立必需的数据库基础构造,以及设置检测系统(pollingsystem).完成上述步骤后,现在我们可以通过编程或声明的方式,在添加缓存条目时使用SQLcachedependency.在本节,我们探讨如何使用声明的方式使用SQLcachedependencies,在第六步再探讨通过编程的方式。
在《CachingDatawiththeObjectDataSource》教程里,我们考察了声明ObjectDataSource控件的缓存功能。
仅仅将EnableCaching属性设置为true,并将acheDuration属性设置为某个时间间(timeinterval),ObjectDataSource控件就会自动地将从“源对象”(underlyingobject)返回的数据进行缓存。
ObjectDataSource控件可以使用单个或多个SQLcachedependencies.
为此,打开文件夹Caching里的SqlCacheDependencies.aspx页面,在设计模式里,从工具箱拖一个GridView控件到页面上,设置其ID为ProductsDeclarative,从其智能标签里将其绑定到一个名为ProductsDataSourceDeclarative的ObjectDataSource.
图5:
创建一个名为ProductsDataSourceDeclarative的ObjectDataSource
设置该ObjectDataSource使用ProductsBLL类。
在SELECT标签里选GetProducts()方法;
在UPDATE标签里,选择包含3个输入参数——productName,unitPrice,和productID的UpdateProduct重载方法;
在INSERT和DELETE标签里选“(None)”.
图6:
使用包含3个输入参数的UpdateProduct重载方法
图7:
在INSERT和DELETE标签的下拉列表里选“(None)”
完成设置后,VisualStudio会为GridView里的每一列创建绑定列(BoundFields)和CheckBoxFieldsL列。
将ProductName,CategoryName,和UnitPrice以外的列都删除,对其应用什么格式化都可以。
在GridView的智能标签里启用分页、排序、编辑功能。
VisualStudio会将ObjectDataSource控件的OldValuesParameterFormatString属性设置为original_{0},为使GridView的编辑功能运行正常,要么删除该属性,要么将其设置为默认值:
{0}.
最后,在GridView上面添加一个LabelWeb控件,设置其ID为ODSEvents,再将其EnableViewState属性设置为false.做完上述修改后,页面的声明代码看起来应该和下面的差不多。
注意,我已经对GridView列的外观做了些定制,虽然这对SQLcachedependency功能来说并不是必要的。
asp:
LabelID="
ODSEvents"
runat="
server"
EnableViewState="
False"
GridViewID="
ProductsDeclarative"
AutoGenerateColumns="
DataKeyNames="
ProductID"
DataSourceID="
ProductsDataSourceDeclarative"
AllowPaging="
True"
AllowSorting="
Columns>
CommandFieldShowEditButton="
TemplateFieldHeaderText="
Product"
SortExpression="
ProductName"
EditItemTemplate>
TextBoxID="
Text='
%#Bind("
)%>
'
RequiredFieldValidatorID="
RequiredFieldValidator1"
ControlToValidate="
Display="
Dynamic"
ErrorMessage="
Youmustprovideanamefortheproduct."
SetFocusOnError="
*<
/asp:
RequiredFieldValidator>
/EditItemTemplate>
ItemTemplate>
Label2"
/ItemTemplate>
TemplateField>
BoundFieldDataField="
CategoryName"
HeaderText="
Category"
ReadOnly="
Price"
UnitPrice"
$<
Columns="
8"
"
{0:
N2}"
TextBox>
CompareValidatorID="
CompareValidator1"
Youmustenteravalidcurrencyvaluewith
nocurrencysymbols.Also,thevaluemustbegreaterthan
orequaltozero."
Operator="
GreaterThanEqual"
Type="
Cur