欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

开启SQLSERVER数据库缓存依赖优化网站性能

程序员文章站 2024-03-07 18:38:21
很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现sql server数据库的缓存,当数据表没有更新时,就从缓存...
很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现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)