第三篇 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 都 ...
随机推荐
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- unity 3d 解析 json
官网案例传送门 我这里不过是借花献佛,案例官网就有. using UnityEngine; using System.Collections; public class json : MonoBeha ...
- python学习笔记(python介绍)
为什么要学python? python和shell的比较,和PHP.和JAVA比较 运维开发只是用到python的很小一部分 python在一些知名公司的应用: 谷歌:python的创始人原来在谷歌工 ...
- 访问者模式(visitorpattern)
/** * 访问者模式 * @author TMAC-J * 在客户端和元素之间添加一个访问者 * 当你需要添加一些和元素关系不大的需求时,可以直接放在访问者里面 * 或者是元素之间有一些公共的代码块 ...
- 如何解决流程开发中SheetRadioButtonList页面取值问题
分享一个常见的取值问题. 应用场景: SheetRadioButtonList控件,点击其中一项执行事件操作.如果是页面加载的情况下,值就无法取到. 具体原因如下: 我给SheetRadioButto ...
- Android Studio切换为eclipse的快捷键之后还是有区别的部分快捷键
Android Studio Eclipse 把代码提示换成了Class Name Completion, 快捷键是Ctrl+Alt+Space(空格键). 代码提示快捷键Alt+/, ...
- SQL Server存储过程
创建于2016-12-24 16:12:19 存储过程 概念: 1.存储过程是在数据库管理系统中保存的.预先编译的.能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的 一种数据对象. 2.存储 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 元素绝对居中终极办法兼容IE8
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- could not initialize proxy - no Session
这是一个精典的问题:因为我们在hibernate里面load一个对象出来时,用到的是代理对象,也就是说当我们在执行load方法时并没有发sql语句,而是返回一个proxy对象.只有当们具体用到哪个ge ...