离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,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的更多相关文章

  1. 第二篇 Entity Framework Plus 之 Query Future

    从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分). 今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询 ...

  2. 第一篇 Entity Framework Plus 之 Audit

    一般系统会有登陆日志,操作日志,异常日志,已经满足大部分的需求了.但是有时候,还是需要Audit 审计日志,审计日志,主要针对数据增,改,删操作数据变化的记录,主要是对数据变化的一个追踪过程.其中主要 ...

  3. .NET基础篇——Entity Framework 数据转换层通用类

    在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码.为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F ...

  4. 第四篇 Entity Framework Plus 之 Batch Operations

    用 Entity Framework  进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...

  5. Entity Framework Plus 系列目录

    Entity Framework Plus 系列文章计划的已经全部写完,可能还有其他功能没有写到,希望大家能够多动手,尝试一下使用,一定会给您带来一些帮助的.文章全部写完,也应该出一个目录方便查看,目 ...

  6. entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

    前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...

  7. C# Entity Framework并发处理

    原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...

  8. Entity Framework 之Database first(数据库优先)&Model First(模型优先)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  9. C#综合揭秘——Entity Framework 并发处理详解

    引言 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都 ...

随机推荐

  1. 自定义搭建PHP开发环境

    学习了一段时间php了,因为之前是刚接触php,所以用的是集成安装包(wamp).现在想进一步了解apache.mysql.php之间的关系以及提升自己所以进行自定义搭建PHP开发环境.废话不多说,请 ...

  2. 关于Android避免按钮重复点击事件

    最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...

  3. node中子进程同步输出

    管道 通过"child_process"模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fo ...

  4. node中的Stream-Readable和Writeable解读

    在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...

  5. DOM、BOM 操作超级集合

    本章内容: 定义 节点类型 节点关系 选择器 样式操作方法style 表格操作方法 表单操作方法 元素节点ELEMENT 属性节点attributes 文本节点TEXT 文档节点 Document 位 ...

  6. 手动导入swift三方danielgindi/Charts到OC工程中教程

    1.到github网址上下载zip压缩包https://github.com/danielgindi/Charts 2.然后将解压后的文件夹整个拖到自己的工程文件夹下(很多教程只让拖xcodeproj ...

  7. iOS从零开始学习直播之2.采集

      直播的采集由采集的设备(摄像头.话筒)不同分为视频采集和音频采集,本篇文章会分别介绍. 1.采集步骤   1.创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕 ...

  8. Linux基础介绍【第一篇】

    Linux简介 什么是操作系统? 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心 ...

  9. 【流量劫持】SSLStrip 终极版 —— location 瞒天过海

    前言 之前介绍了 HTTPS 前端劫持 的方案,虽然很有趣,然而现实却并不理想.其唯一.也是最大的缺陷,就是无法阻止脚本跳转.若是没有这个缺陷,那就非常完美了 -- 当然也就没有必要写这篇文章了. 说 ...

  10. EasyPR--中文开源车牌识别系统 开发详解(1)

    在上篇文档中作者已经简单的介绍了EasyPR,现在在本文档中详细的介绍EasyPR的开发过程. 正如淘宝诞生于一个购买来的LAMP系统,EasyPR也有它诞生的原型,起源于CSDN的taotao123 ...