开启SQLSERVER数据库缓存依赖优化网站性能
发布时间:2024-01-26 18:05:20
很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现SQL SERVER数据库的缓存,当数据表没有更新时,就从缓存中读取,当有更新的时候,才从数据表中读取呢,答案是肯定的,这样的话我们对一些常用的基础数据表就可以缓存起来,比如做新闻系统的新闻类别等,每次就不需要从数据库中读取了,加快网站的访问速度。
那么如何开启SQLSERVER数据库缓存依赖,方法如下:
第一步:修改Web.Config的<system.web>节的配置,代码如下,让网站项目启用SqlCacheDependency。注意下面代码中的connectionStringName,就是指定的<connectionStrings>节中的数据库连接字符串变量名称。name则是为该SqlCacheDependency起的名字,这个名字将在第三步中用到。SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx"
type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
<add verb="*" path="*.shtml"
type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
<add verb="*" path="*.bobo"
type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
<!-->以下设置数据库缓存依赖方式-->
<caching>
<sqlCacheDependency enabled="true" pollTime="6000">
<databases>
<add name="YD_JWC_JAKE" connectionStringName="cachestr"/>
</databases>
</sqlCacheDependency>
</caching>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug="true">
<assemblies>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Forms">
<forms loginUrl="login.aspx" name=".AJSUPCXAIUTH"></forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。-->
<customErrors mode="RemoteOnly" defaultRedirect="/ER3.shtml">
<error statusCode="403" redirect="/ER1.shtml" />
<error statusCode="404" redirect="/ER404.shtml" />
</customErrors>
</system.web>
第二步:在CMD中执行下述命令,以开启SQL SERVER数据库对SqlCacheDependency的支持,利用aspnet_regsql.exe工具,该工具位于windows\microsoft.net\framework\[版本]文件夹中
代码如下:
aspnet_regsql -C "data source=127.0.0.1;initial catalog=YD_JWC_JAKE;user id=sa;password=" -ed -et -t "T_NewsClass"
参数-C后面跟着的是数据库连接字符串,注意字母C是大写。参数-t后面跟着的就是你要开启数据库缓存的数据表,此处我为新闻类别的表开启了缓存依赖。(如果有多个表,则重复执行此命令,注意修改你的数据表名)
第三步:在获取数据的业务层代码中,如果是第一次读取,则从数据库中读取后,存入缓存里。以后获取数据时,数据库会自动判断表是否有更新数据,如果有,则读数据库同时更新缓存,如果没有更新,则从数据库中读取。代码如下:
private void getInfoClass( int t)
{
string CacheKey = "cacheclass" + t.ToString();
object objModle = Jake.DataCache.GetCache(CacheKey);//从缓存中获取
DataTable dt=null;
if (objModle == null)//如果缓存中没有则读取数据库
{
Jake.BLL.NewsManage.NewsClass nc = new Jake.BLL.NewsManage.NewsClass();
dt = nc.GetList("").Tables[0];
objModle = dt;
if (objModle != null)
{
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("YD_JWC_JAKE", "T_NewsClass");
Jake.DataCache.SetCache(CacheKey, objModle, dep);
}
}
else
{
dt = (DataTable)objModle; //缓存中有就直接读取缓存,不需要访问数据库
}
DataRow[] drs = dt.Select("","classid");
StringBuilder sb =new StringBuilder();
sb.Append("<ul>");
foreach (DataRow r in drs)
{
string cid=r["ClassId"].ToString();
Security js = new Security();
string decrystr = Jake.Common.ConfigHelper.GetConfigString("DecryStr");//获得加密密钥
cid = js.EncryptQueryString(cid, decrystr);
string cdesc=r["ClassDesc"].ToString();
if (t == 1)
{
sb.Append("<li><a href="/Info" + cid + ".shtml" href="Info" + cid + ".shtml"><span class='fontbold'>" + cdesc + "</span></a></li>");
}
else if (t == 2)
{
sb.Append("<li><a href="/File" + cid +".shtml" href="File" + cid +".shtml"><span class='fontbold'>" + cdesc + "</span></a></li>");
}
else
sb.Append("<li><a href="/FAQ" + cid + ".shtml" href="FAQ" + cid + ".shtml"><span class='fontbold'>" + cdesc + "</span></a></li>");
}
sb.Append("</ul>");
Response.Write(sb);
}
以上代码中Jake.DataCache.GetCache()方法是自己定义的一个获取和设置缓存的通用方法,单独编译成了DLL:
代码如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
namespace Jake
{
public class DataCache
{
/// <summary>
/// 获取当前应用程序指定CacheKey的Cache值
/// </summary>
/// <param name="CacheKey"></param>
/// <returns></returns>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
}
/// <summary>
/// 设置当前应用程序指定CacheKey的Cache值
/// </summary>
/// <param name="CacheKey"></param>
/// <param name="objObject"></param>
public static void SetCache(string CacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject);
}
/// <summary>
/// 设置已缓存依赖的方式缓存数据
/// </summary>
/// <param name="CacheKey">键值</param>
/// <param name="objObject">缓存对象</param>
/// <param name="dep">缓存依赖项</param>
public static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(
CacheKey,
objObject,
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration,//从不过期
System.Web.Caching.Cache.NoSlidingExpiration,//禁用可调过期
System.Web.Caching.CacheItemPriority.Default,
null
);
}
}
}
至此,对于数据表的缓存依赖就已经开启,这样可以大大加快网站访问的速度。
(转载请注明本文出处:http://blog.csdn.net/j_jake)


猜你喜欢
- 一、什么是sql注入呢? 所谓SQL注入,就是
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作⚠️边界填充概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天
- 功能输入一个特定格式的时间戳,自动获取前进或者后退多少小时之后的时间附加函数时间戳转换函数def date_time_str_to_long
- 引言之前有段时间用postgresql 数据库,在上云之后,从自增主键变为uuid,感觉uuid全球唯一,很方便。最近用mysql,发现my
- 有的小伙伴在学习数据库的时候,创建表结构的时候不小心把某字段设置成了varchar但是在统计求和的时候就傻眼了,接下来跟着小编学习一下,不用
- 1.apache 在如下页面下载apache的for Linux 的源码包 http://www
- 在使用aiohttp结合apscheduler的AsyncIOScheduler模拟定点并发的时候遇到两个问题在调度器scheduler.s
- 本文实例讲述了Python2.7+pytesser实现简单验证码的识别方法。分享给大家供大家参考,具体如下:首先,安装Python2.7版本
- 你说的就是真正的计数器,它只在有新的用户进入网站时,计数器才会加1,忠实可靠。把下列代码放到的global.asa的sessio
- Mysql环境变量配置mysql的环境变量配置步骤1.1、在桌面选择“计算机”的图标,右键&
- 懒加载:也叫延迟加载,即在需要的时候进行加载,随用随载。 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文
- 前言requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻
- 1、内容在一屏内显示的,采用了(内容框)上下左右居中的办法,里面的内容绝对于这个内容框定位.这样一来,在不同大小屏中,内容总是在中间,看起来
- 按照CSS规范,浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。因此当其高度超出包含
- 数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。举个例子:x
- 今天在继续学习Python时,打开Pycharm后,发现有一个项目下的项目文件名是红色的,如下图:刚开始我以为是我升级 Pycharm导致的
- AnacondaNavigator Jupyter Notebook更换Python内核 前言为什么要换呢,因为新安装的Anaco
- Merge函数的用法简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的
- 本程序是利用3.x的Firefox浏览器可以读取本地文件的特性,实现通过xmlHttPRequest上传大文件功能,并在可以上传过程中动态显
- 1、序言  上一节快速搭建Express开发系统步骤,对如何使用express-generator创建一