Hxj.Data 数据库组件文档 下载本文

HxjCacheConfig 节点的 enable 表示是否开启缓存,默认是关闭状态,除非显式开启 enable=\true\。

entities 节点下的配置就是对实体查询的缓存配置。

表示connectionStrings中的节点name=\NorthwindConnectionString\的连接下的Products表配置. value=\60\表示缓存60秒。

所以一定要connectionStrings的name加上实体名,不然配置无效。 当然value也可以是缓存依赖的文件。

表示Products表的查询缓存依赖程序根目录下的1.txt文件。组件会判断该文件是否存在,不存在则该配置无效。 那测试一下缓存配置。

List list = new List(); for (int i = 0; i < 2; i++) {

list.Add(DbSession.Default.From().ToFirst()); }

for (int i = 0; i < 3; i++) {

list.Add(DbSession.Default.From().ToFirst()); }

我们设置 enable=\false\,关闭缓存。 看一下组件执行的sql:

45

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @1a6b9589aa23444c9e6e13049220c19d)

Parameters: @1a6b9589aa23444c9e6e13049220c19d[Int32] = 1

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @61ce100cf8074e76abc8d205b3ec0a2e)

Parameters: @61ce100cf8074e76abc8d205b3ec0a2e[Int32] = 1

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @c99aa7541e1543aca08c28f65c7b1d4d)

Parameters: @c99aa7541e1543aca08c28f65c7b1d4d[Int32] = 1

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @c8f9ce2df63f451aa09cbc4fa62acd9c)

Parameters: @c8f9ce2df63f451aa09cbc4fa62acd9c[Int32] = 1

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @d786265aa9bd40bfbc253814d6c16b13)

Parameters: @d786265aa9bd40bfbc253814d6c16b13[Int32] = 1

执行了5次查询。

再设置 enable=\true\,开启缓存。 再查看一下执行的sql:

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @075ce07012884a21878604c197ddb7cc)

Parameters: @075ce07012884a21878604c197ddb7cc[Int32] = 1

只执行了一次sql连接。

后面的四次都是直接从缓存中读取的。

再次执行,所有的查询都是直接从缓存中返回回来,没有连接数据库。 测试缓存文件依赖:

List list = new List(); for (int i = 0; i < 2; i++) {

list.Add(DbSession.Default.From().Where(Products._.ProductID == 3).ToFirst()); }

FileHelper.AppendText(Server.MapPath(\), \); System.Threading.Thread.Sleep(2000);

46

for (int i = 0; i < 3; i++) {

list.Add(DbSession.Default.From().Where(Products._.ProductID == 3).ToFirst()); }

查看sql:

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @aa4964dae36c479792186ea95ce10b6e)

Parameters: @aa4964dae36c479792186ea95ce10b6e[Int32] = 3

Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @e614d6bbc84c4603b159e30644665e07)

Parameters: @e614d6bbc84c4603b159e30644665e07[Int32] = 3

执行了两次,当修改文件后,缓存失效重新从数据库查询数据。 其实测试的有时候输出一条sql,可能是执行的太快,缓存失效来不及。 所以后来才加了System.Threading.Thread.Sleep(2000);

再次刷新,就只输出一条sql,只执行一次,也就是修改1.txt文件后才重新查询数据库。

查询判断是否有缓存配置是根据 From()这里的Products来判断是否存在缓存配置的。

对于ToDataReader()查询,是不会缓存的。

当然用到ToDataReader的查询的其他方法也不会缓存,例如上一节中的Exists(WhereClip where)方法。 下一节将讲述自定义缓存。

数据库组件 Hxj.Data (二十三) (自定义缓存)

配置的缓存并不能满足我们的需求,例如有时候需要刷新缓存,或者某次查询缓存时间或者缓存依赖不一样等。 刷新缓存 例如:

47

DbSession.Default.From().Where(Products._.ProductID == 1).Refresh().ToFirst();

Refresh()方法设置了刷新缓存,即不从缓存中读取,直接从数据库读取最新数据,并重新缓存。 设置查询的缓存有效期。 例如:

DbSession.Default.From().Where(Products._.ProductID == 1).SetCacheTimeOut(180).ToFirst(); 设置该查询的缓存时间为180秒。

该设置会覆盖默认缓存配置,并且缓存配置中没有实体设置,也会缓存。 当下次执行:

DbSession.Default.From().Where(Products._.ProductID == 1).ToFirst(); 在180秒内缓存有效。 设置缓存依赖。 例如:

System.Web.Caching.CacheDependency cacheDep = new

System.Web.Caching.CacheDependency(Server.MapPath(\));

DbSession.Default.From().Where(Products._.ProductID == 1).SetCacheDependency(cacheDep).ToFirst(); 设置该查询缓存的缓存依赖为2.txt文件。

该设置会覆盖默认缓存配置,并且缓存配置中没有实体设置,也会缓存。 当再次执行:

DbSession.Default.From().Where(Products._.ProductID == 1).ToFirst();

如果2.txt文件没有改变,缓存是不会失效的。 当然这几个方法也可以同时使用。

48