数据库组件 Hxj.Data (二十二) (缓存)
2010-02-08 08:41
435 查看
首先我是做web开发的,所以很多会偏向web的,组件使用的缓存是System.Web.HttpRuntime.Cache。
组件在默认情况下是关闭缓存的。
所以要开启缓存查询要做一下配置。
先看一下例子配置:
HxjCacheConfig 节点的 enable 表示是否开启缓存,默认是关闭状态,除非显式开启 enable="true"。
entities 节点下的配置就是对实体查询的缓存配置。
<add key="NorthwindConnectionString.Products" value="60"></add>
表示connectionStrings中的节点name="NorthwindConnectionString"的连接下的Products表配置.
value="60" 表示缓存60秒。
所以一定要connectionStrings的name加上实体名,不然配置无效。
当然value也可以是缓存依赖的文件。
表示Products表的查询缓存依赖程序根目录下的1.txt文件。组件会判断该文件是否存在,不存在则该配置无效。
那测试一下缓存配置。
我们设置 enable="false",关闭缓存。
看一下组件执行的sql:
[/code]
执行了5次查询。
再设置 enable="true",开启缓存。
再查看一下执行的sql:
[/code]
只执行了一次sql连接。
后面的四次都是直接从缓存中读取的。
再次执行,所有的查询都是直接从缓存中返回回来,没有连接数据库。
测试缓存文件依赖:
查看sql:
[/code]
执行了两次,当修改文件后,缓存失效重新从数据库查询数据。
其实测试的有时候输出一条sql,可能是执行的太快,缓存失效来不及。
所以后来才加了System.Threading.Thread.Sleep(2000);
再次刷新,就只输出一条sql,只执行一次,也就是修改1.txt文件后才重新查询数据库。
查询判断是否有缓存配置是根据 From<Products>()这里的Products来判断是否存在缓存配置的。
对于ToDataReader()查询,是不会缓存的。
当然用到ToDataReader的查询的其他方法也不会缓存,例如上一节中的Exists<TEntity>(WhereClip where)方法。
下一节将讲述自定义缓存。
组件在默认情况下是关闭缓存的。
所以要开启缓存查询要做一下配置。
先看一下例子配置:
<configSections> <section name="HxjCacheConfig" type="Hxj.Data.CacheConfiguration,Hxj.Data"/> </configSections> <HxjCacheConfig enable="true"> <entities> <add key="NorthwindConnectionString.Products" value="60"></add> </entities> </HxjCacheConfig> <connectionStrings> <add name="NorthwindConnectionString" connectionString="Data Source=ricci\hu;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
HxjCacheConfig 节点的 enable 表示是否开启缓存,默认是关闭状态,除非显式开启 enable="true"。
entities 节点下的配置就是对实体查询的缓存配置。
<add key="NorthwindConnectionString.Products" value="60"></add>
表示connectionStrings中的节点name="NorthwindConnectionString"的连接下的Products表配置.
value="60" 表示缓存60秒。
所以一定要connectionStrings的name加上实体名,不然配置无效。
当然value也可以是缓存依赖的文件。
<add key="NorthwindConnectionString.Products" value="1.txt"></add>
表示Products表的查询缓存依赖程序根目录下的1.txt文件。组件会判断该文件是否存在,不存在则该配置无效。
那测试一下缓存配置。
List<Products> list = new List<Products>(); for (int i = 0; i < 2; i++) { list.Add(DbSession.Default.From<Products>().ToFirst()); } for (int i = 0; i < 3; i++) { list.Add(DbSession.Default.From<Products>().ToFirst()); }
我们设置 enable="false",关闭缓存。
看一下组件执行的sql:
[code]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
[/code]
执行了5次查询。
再设置 enable="true",开启缓存。
再查看一下执行的sql:
[code]Text: SELECT TOP 1 * FROM [Products] WHERE ([Products].[ProductID] = @075ce07012884a21878604c197ddb7cc) Parameters: @075ce07012884a21878604c197ddb7cc[Int32] = 1
[/code]
只执行了一次sql连接。
后面的四次都是直接从缓存中读取的。
再次执行,所有的查询都是直接从缓存中返回回来,没有连接数据库。
测试缓存文件依赖:
List<Products> list = new List<Products>(); for (int i = 0; i < 2; i++) { list.Add(DbSession.Default.From<Products>().Where(Products._.ProductID == 3).ToFirst()); } FileHelper.AppendText(Server.MapPath("~/1.txt"), "abc");
System.Threading.Thread.Sleep(2000);
for (int i = 0; i < 3; i++) { list.Add(DbSession.Default.From<Products>().Where(Products._.ProductID == 3).ToFirst()); }
查看sql:
[code]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
[/code]
执行了两次,当修改文件后,缓存失效重新从数据库查询数据。
其实测试的有时候输出一条sql,可能是执行的太快,缓存失效来不及。
所以后来才加了System.Threading.Thread.Sleep(2000);
再次刷新,就只输出一条sql,只执行一次,也就是修改1.txt文件后才重新查询数据库。
查询判断是否有缓存配置是根据 From<Products>()这里的Products来判断是否存在缓存配置的。
对于ToDataReader()查询,是不会缓存的。
当然用到ToDataReader的查询的其他方法也不会缓存,例如上一节中的Exists<TEntity>(WhereClip where)方法。
下一节将讲述自定义缓存。
相关文章推荐
- 数据库组件 Hxj.Data (二十二) (缓存)
- 数据库组件 Hxj.Data (二十三) (自定义缓存)
- 数据库组件 Hxj.Data (二十三) (自定义缓存)
- 数据库组件 Hxj.Data (二十四)(Sqlite数据库)
- 数据库组件 Hxj.Data (五)(更新操作篇)
- 数据库组件 Hxj.Data (十六) (查询的字段)
- 数据库组件 Hxj.Data (二十五)(数据库连接配置 - connectionStrings节点)
- 数据库组件 Hxj.Data (二十一) (ToScalar<TResult>)
- 数据库组件 Hxj.Data (十三) (子查询)
- 数据库组件 Hxj.Data (十四) (联合查询)
- 数据库组件 Hxj.Data (二十四)(Sqlite数据库)
- 数据库组件 Hxj.Data (二十七)(字段组合更新)
- 数据库组件 Hxj.Data (十八) (批处理)
- 数据库组件 Hxj.Data (二)(实体生成工具)
- 数据库组件 Hxj.Data (六)(删除操作篇)
- 数据库组件 Hxj.Data(七) (sql篇)
- 数据库组件 Hxj.Data (二十六)(Oracle 配置)
- 数据库组件 Hxj.Data (二十八)(事务中的查询,查询字段字中的子查询,WhereClip的隐式转换)
- 数据库组件 Hxj.Data (三十)(Asp.Net 页面自动赋值与取值)
- 数据库组件 Hxj.Data (十九) (事务二)