第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇
第一篇 Entity Framework Plus 之 Audit
第二篇 Entity Framework Plus 之 Query Future
计划还会写两篇,一篇是关于查询缓存的(二级缓存),一篇是批量操作(只讲更新,删除)。
今天写查询缓存,标题 第三篇 Entity Framework Plus 之 Query Cache ,废话不多说,直接实作。
一. 代码实现
1. 解决方案还是前两篇的用的 “EntityFrameworkPlusSolution” 解决方案,在“01.Demo” 解决方案文件夹,新增“EntityFrameworkPlus.QueryCache.Demo” Windows 项目(为什么要用Windows 项目,方便Demo和测试而已。)

2. “EntityFrameworkPlus.QueryCache.Demo” 项目中,删除原来Form1 窗口相关文件,分别新增“QueryCache” 后,“NoExpirationQueryCache”,“AbsoluteExpirationQueryCache”,“SlidingExpirationQueryCache” 窗口,界面设计分别如下图。
QueryCache

NoExpirationQueryCache

AbsoluteExpirationQueryCache

SlidingExpirationQueryCache

四个界面很简单,这里大概介绍一下,
QueryCache 就像操作台一样,是其他三个界面入口点。
NoExpirationQueryCache 不做缓存过期时间设置查询缓存
AbsoluteExpirationQueryCache 指定缓存过期时间(以秒为单位) 设置查询缓存
SlidingExpirationQueryCache 最后一次访问缓存时间间隔(以秒为单位) 设置查询缓存
3. 代码
QueryCache
using System;
using System.Windows.Forms; namespace EntityFrameworkPlus.QueryCache.Demo
{
public partial class QueryCache : Form
{
public QueryCache()
{
InitializeComponent();
} private void btnNoExpirationQueryCache_Click(object sender, EventArgs e)
{
new NoExpirationQueryCache().ShowDialog();
} private void btnAbsoluteExpirationQueryCache_Click(object sender, EventArgs e)
{
new AbsoluteExpirationQueryCache().ShowDialog();
} private void btnSlidingExpirationQueryCache_Click(object sender, EventArgs e)
{
new SlidingExpirationQueryCache().ShowDialog();
}
}
}
NoExpirationQueryCache
using System;
using System.Windows.Forms;
using EntityFrameworkPlus.DbContext;
using Z.EntityFramework.Plus; namespace EntityFrameworkPlus.QueryCache.Demo
{
public partial class NoExpirationQueryCache : Form
{
public NoExpirationQueryCache()
{
InitializeComponent();
} private void btnSearch_Click(object sender, EventArgs e)
{
using (var db = new EntityFrameworkPlusDbContext())
{
var orders = db.Goodses.FromCache();
dgList.DataSource = orders;
}
}
}
}
AbsoluteExpirationQueryCache
using System;
using System.Windows.Forms;
using EntityFrameworkPlus.DbContext;
using Z.EntityFramework.Plus; namespace EntityFrameworkPlus.QueryCache.Demo
{
public partial class AbsoluteExpirationQueryCache : Form
{
public AbsoluteExpirationQueryCache()
{
InitializeComponent();
} private void btnSearch_Click(object sender, EventArgs e)
{
using (var db = new EntityFrameworkPlusDbContext())
{
var second = Convert.ToDouble(txtAbsoluteExpiration.Text.Trim());
var absoluteExpirationSecond = DateTime.Now.AddSeconds(second);
var orders = db.Goodses.FromCache(absoluteExpirationSecond);
dgList.DataSource = orders;
}
}
}
}
SlidingExpirationQueryCache
using System;
using System.Runtime.Caching;
using System.Windows.Forms;
using EntityFrameworkPlus.DbContext;
using Z.EntityFramework.Plus; namespace EntityFrameworkPlus.QueryCache.Demo
{
public partial class SlidingExpirationQueryCache : Form
{
public SlidingExpirationQueryCache()
{
InitializeComponent();
} private void btnSearch_Click(object sender, EventArgs e)
{
using (var db = new EntityFrameworkPlusDbContext())
{
var second = Convert.ToDouble(txtSlidingExpiration.Text.Trim());
var options = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(second) };
var orders = db.Goodses.FromCache(options);
dgList.DataSource = orders;
}
}
}
}
代码就不做解释,等一下逐个测试一下给大家看,查询的信息是上一篇第二篇 Entity Framework Plus 之 Query Future商品信息(Sample_Goods),查询后会直接展示到DataGridView里面。
二.测试效果(记得打开SQL Profiler 追踪SQL)
NoExpirationQueryCache 不做缓存过期时间设置查询缓存
1. 点击查询按钮一次,Demo如下图

2. 清空一下Sql Profiler 执行的SQL(这个应该不用我教大家都会),接着连续点击查询按钮,Demo如图

DataGridView 依旧会有数据展示出来,但是SQL Profiler 是没有执行查询商品信息的SQL,说明之后查询是取缓存中的,如果缓存中存在,就不去执行SQL.
AbsoluteExpirationQueryCache 指定缓存过期时间(以秒为单位) 设置查询缓存 (每次Demo另外一个场景,把程序关闭一次,避免Demo不会有问题。)
1. 设置缓存过期时间为10秒,点一次查询,Demo如下图

2. 清空一下Sql Profiler 执行的SQL,然后在10范围内,连续点查询,Demo如下图

3. 过了10秒在点查询按钮,Demo 如下图

从上面三种操作,说明10秒内,点击查询,商品信息,已经被缓存,就不会和数据库进行交流,当过了10秒商品信息的缓存就会自动清除,重新到数据库取数据。
SlidingExpirationQueryCache 最后一次访问缓存时间间隔(以秒为单位) 设置查询缓存
1. 最后访问缓存时间间隔设置10s ,点击查询,Demo如下图

2. 清空一下Sql Profiler 执行的SQL,连续点击查询按钮,只要最后一次访问缓存不超过10s,Demo如下图

3. 最后一次访问缓存时间间隔晚于10s ,Demo如下图

从上面三种操作来看,只要最后一次访问缓存不超过设置时间间隔,即就不会和数据库打交道,总是会取缓存数据,否则不然。
到此 Entity Framework Plus 之 Query Cache 就写完,大家可以更加深入的了解 Entity Framework Plus Query Cache 可以自行看源码
Entity Framework Plus GitHub :https://github.com/zzzprojects/EntityFramework-Plus
本博文源代码 :https://github.com/haibozhou1011/EntityFramework-PlusSample
第三篇 Entity Framework Plus 之 Query Cache的更多相关文章
- 第二篇 Entity Framework Plus 之 Query Future
从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分). 今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询 ...
- 第一篇 Entity Framework Plus 之 Audit
一般系统会有登陆日志,操作日志,异常日志,已经满足大部分的需求了.但是有时候,还是需要Audit 审计日志,审计日志,主要针对数据增,改,删操作数据变化的记录,主要是对数据变化的一个追踪过程.其中主要 ...
- .NET基础篇——Entity Framework 数据转换层通用类
在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码.为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F ...
- 第四篇 Entity Framework Plus 之 Batch Operations
用 Entity Framework 进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...
- Entity Framework Plus 系列目录
Entity Framework Plus 系列文章计划的已经全部写完,可能还有其他功能没有写到,希望大家能够多动手,尝试一下使用,一定会给您带来一些帮助的.文章全部写完,也应该出一个目录方便查看,目 ...
- entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等
前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...
- C# Entity Framework并发处理
原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...
- Entity Framework 之Database first(数据库优先)&Model First(模型优先)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- C#综合揭秘——Entity Framework 并发处理详解
引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都 ...
随机推荐
- angularjs 依赖注入--自己学着实现
在用angular依赖注入时,感觉很好用,他的出现是 为了"削减计算机程序的耦合问题" ,我怀着敬畏与好奇的心情,轻轻的走进了angular源码,看看他到底是怎么实现的,我也想写个 ...
- C# 索引器,实现IEnumerable接口的GetEnumerator()方法
当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...
- ASP.NET MVC原理
仅此一文让你明白ASP.NET MVC原理 ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与 ...
- HTML 5 应用程序缓存manifest
什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏 ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- 【干货分享】流程DEMO-人员调动流程
流程名: 调动 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片:3.png DEMO包下载: http://files.cnblogs.com ...
- SharePoint 2016 必备组件离线安装介绍
前言 SharePoint 必备组件安装,一直以来都是SharePoint安装过程中的最大的坑,尤其是不能联网的服务器.博主在这里简单介绍一下离线安装过程,并附组件包下载以及安装命令,并且在windo ...
- OpenGL shader 中关于顶点坐标值的思考
今天工作中需要做一个事情: 在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示. 思路很简单,在vertex shader内知道顶点坐标,进行计 ...
- asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题
最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...
- Rxjava Subjects
上次提到调用observable的publish和connect方法后可以将一个Observable发出的对象实时传递到订阅在上的subscriber. 这个和Rxjava中Subject的概念十分相 ...