开启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)
那么如何开启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)