• 第三篇 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();
            }
        }
    }
    View Code

    NoExpirationQueryCache 

     1 using System;
     2 using System.Windows.Forms;
     3 using EntityFrameworkPlus.DbContext;
     4 using Z.EntityFramework.Plus;
     5 
     6 namespace EntityFrameworkPlus.QueryCache.Demo
     7 {
     8     public partial class NoExpirationQueryCache : Form
     9     {
    10         public NoExpirationQueryCache()
    11         {
    12             InitializeComponent();
    13         }
    14 
    15         private void btnSearch_Click(object sender, EventArgs e)
    16         {
    17             using (var db = new EntityFrameworkPlusDbContext())
    18             {
    19                 var orders = db.Goodses.FromCache();
    20                 dgList.DataSource = orders;
    21             }
    22         }
    23     }
    24 }
    View Code

    AbsoluteExpirationQueryCache 

     1 using System;
     2 using System.Windows.Forms;
     3 using EntityFrameworkPlus.DbContext;
     4 using Z.EntityFramework.Plus;
     5 
     6 namespace EntityFrameworkPlus.QueryCache.Demo
     7 {
     8     public partial class AbsoluteExpirationQueryCache : Form
     9     {
    10         public AbsoluteExpirationQueryCache()
    11         {
    12             InitializeComponent();
    13         }
    14 
    15         private void btnSearch_Click(object sender, EventArgs e)
    16         {
    17             using (var db = new EntityFrameworkPlusDbContext())
    18             {
    19                 var second = Convert.ToDouble(txtAbsoluteExpiration.Text.Trim());
    20                 var absoluteExpirationSecond = DateTime.Now.AddSeconds(second);
    21                 var orders = db.Goodses.FromCache(absoluteExpirationSecond);
    22                 dgList.DataSource = orders;
    23             }
    24         }
    25     }
    26 }
    View Code

    SlidingExpirationQueryCache 

     1 using System;
     2 using System.Runtime.Caching;
     3 using System.Windows.Forms;
     4 using EntityFrameworkPlus.DbContext;
     5 using Z.EntityFramework.Plus;
     6 
     7 namespace EntityFrameworkPlus.QueryCache.Demo
     8 {
     9     public partial class SlidingExpirationQueryCache : Form
    10     {
    11         public SlidingExpirationQueryCache()
    12         {
    13             InitializeComponent();
    14         }
    15 
    16         private void btnSearch_Click(object sender, EventArgs e)
    17         {
    18             using (var db = new EntityFrameworkPlusDbContext())
    19             {
    20                 var second = Convert.ToDouble(txtSlidingExpiration.Text.Trim());
    21                 var options = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(second) };
    22                 var orders = db.Goodses.FromCache(options);
    23                 dgList.DataSource = orders;
    24             }
    25         }
    26     }
    27 }
    View Code

    代码就不做解释,等一下逐个测试一下给大家看,查询的信息是上一篇第二篇 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

  • 相关阅读:
    [转]关于Activity和Task的设计思路和方法
    关于Zipalign的介绍和使用方法
    [转]Android 技术专题系列之九 -- 图形系统
    【转】如何调试跟踪Android源代码
    为程序添加版本自动更新功能(转+详细分析)
    【转】在 Eclipse 內,用 Ant 編譯你的 Android 程式
    android 用HttpURLConnection读网络
    步步为营 .NET 设计模式学习笔记 十、Builder(建造者模式)
    步步为营 .NET 设计模式学习笔记 八、State(状态模式)
    步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
  • 原文地址:https://www.cnblogs.com/davidzhou/p/5384441.html
Copyright © 2020-2023  润新知