系统缓存全解析6:数据库缓存依赖

 

    更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。

   答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。

  

实现步骤:

    下面就让我们看一下如何实现数据库缓存依赖功能:

第一步: 修改web.config,让项目启用SqlCacheDependency

将下列代码加入web.config<system.web>节:        

<?xml version="1.0"?>

<configuration>

    <appSettings/>

    <connectionStrings>

        <add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=codematic;user id=sa;password="  providerName="System.Data.SqlClient" />

    </connectionStrings>

    <system.web>

        <caching>

            <sqlCacheDependency enabled="true" pollTime="6000">

                <databases>

                    <add name="codematic" connectionStringName="strcodematic" />

                </databases>

            </sqlCacheDependency>         

        </caching>

    

        <compilation debug="true">

        </compilation>     

        <authentication mode="Windows"/>      

    </system.web>

</ configuration >

 

这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

 

注意:

<databases>节的<add name="codematic" connectionStringName="strcodematic" />中的name属性值必须和第三步的Page_Load代码System.Web.Caching.SqlCacheDependency("codematic", "P_Product"); 中的第一个参数(数据库名称)相一致

 


第二步:执行下述命令,为 数据库启用缓存依赖。

如果要配置SqlCacheDependency,则需要以命令行的方式执行。

aspnet_regsql.exe工具位于Windows//Microsoft.NET//Framework//[版本]文件夹中。

aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

参数-t后面的字符串是数据表的名字。

 

 运行结果如图15-3所示:

 

 

15-3  启用数据库缓存依赖

 命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。

注意:

要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

有两种方法配置SQLServer

一 使用aspnet_regsql命令行工具,

二 使用SqlCacheDependencyAdmin类。

 

例如:

aspnet_regsql -S "server" -E -d "database" –ed  或者

aspnet_regsql -S "server" -E -d "database" -et -t "table"
如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

 

以下是该工具的命令参数说明

-? 显示该工具的帮助功能;

-S 后接的参数为数据库服务器的名称或者IP地址;

-U 后接的参数为数据库的登陆用户名;

-P 后接的参数为数据库的登陆密码;

-E 使用当前登录用户的 Windows 集成认证进行身份验证。

-d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

-C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

-t 后接参数为对哪一个表采用SqlCacheDependency功能;

-ed 允许对数据库使用SqlCacheDependency功能;

-dd 禁止对数据库采用SqlCacheDependency功能;

-et 允许对数据表采用SqlCacheDependency功能;

-dt 禁止对数据表采用SqlCacheDependency功能;

-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。

 


第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

   

/// <summary>

/// 获取当前应用程序指定CacheKeyCache对象值

/// </summary>

/// <param name="CacheKey">索引键值</param>

/// <returns>返回缓存对象</returns>

public static object GetCache(string CacheKey)

{

    System.Web.Caching.Cache objCache = HttpRuntime.Cache;

    return objCache[CacheKey];

}

/// <summary>

/// 设置以缓存依赖的方式缓存数据

/// </summary>

/// <param name="CacheKey">索引键值</param>

/// <param name="objObject">缓存对象</param>

/// <param name="cacheDepen">依赖对象</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);

}

protected void Page_Load(object sender, EventArgs e)

{

    string CacheKey = "cachetest";

    object objModel = GetCache(CacheKey);//从缓存中获取

    if (objModel == null)//缓存里没有

    {

        objModel = GetData();//把当前时间进行缓存

        if (objModel != null)

        {

            //依赖数据库codematic中的P_Product表变化来更新缓存

            System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "P_Product");

            SetCache(CacheKey, objModel, dep);//写入缓存

        }

    }

               

    GridView1.DataSource = (DataSet)objModel;

    GridView1.DataBind();

}

//查询数据

private DataSet GetData()

{

    string conString = "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=";

    string strSQL = "SELECT * FROM P_Product";

    SqlConnection myConnection = new SqlConnection(conString);

    DataSet ds = new DataSet();

    myConnection.Open();

    SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection);

    adapter.Fill(ds, "Product");

    myConnection.Close();

    return ds;

}

 

     从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency

     其中,创建SqlCacheDependency的构造方法:

        public SqlCacheDependency (string databaseEntryName,string tableName)

 

l  databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency databases 元素中定义的数据库的名称。

l  tableName :与 SqlCacheDependency 关联的数据库表的名称。

    这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

  

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 这个错误通常发生在 Android 开发中,因为缺少必要的依赖或者类没有正确导入。 要解决这个问题,可以尝试以下几个步骤: 1. 检查是否在代码中正确导入了 SQLiteOpenHelper 类,如果没有请添加正确的 import 语句。 2. 确认是否在项目的 build.gradle 文件中正确添加了 SQLite 依赖项。可以在 dependencies 块中添加以下依赖项: ``` implementation 'androidx.sqlite:sqlite:2.2.0' ``` 3. 如果您使用的是 Kotlin,请检查是否正确添加了 Kotlin 的依赖项。可以在 dependencies 块中添加以下依赖项: ``` implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" ``` 4. 如果仍然无法解决问题,可以尝试重新构建项目或清除项目缓存。在 Android Studio 中,可以通过点击 "Build" 菜单中的 "Clean Project" 或 "Rebuild Project" 来进行操作。 如果以上方法都没有解决问题,您可以在开发者社区或相关论坛中提问,以获取更多帮助。 ### 回答2: 无法解析符号 'SQLiteOpenHelper' 是指在代码中使用了一个未定义或无法找到的类或接口名 "SQLiteOpenHelper"。 在Android开发中,SQLiteOpenHelper 是一个帮助类,用于管理SQLite数据库的创建和版本控制。通常,我们会创建一个继承自 SQLiteOpenHelper 的子类来实现数据库的创建和更新。然后,我们可以在代码中调用这个子类来执行数据库操作。 当出现无法解析符号 'SQLiteOpenHelper' 的错误时,可能是由于以下原因: 1. 忘记导入正确的包:在使用 SQLiteOpenHelper 之前,需要确保已经正确导入了 android.database.sqlite.SQLiteOpenHelper 包。 2. 未正确命名子类:如果 SQLiteOpenHelper 的子类没有被正确命名,或者命名不符合Java的命名规范,也会导致无法解析符号 'SQLiteOpenHelper' 的错误。 3. 缺少SQLiteOpenHelper的依赖:如果在项目的依赖项中没有正确添加 SQLiteOpenHelper 的库,则编译器将无法找到该类。 解决这个问题的方法是: 1. 检查包导入:确保已经正确导入了 android.database.sqlite.SQLiteOpenHelper 包。 2. 检查命名:检查 SQLiteOpenHelper 的子类是否被正确命名,确保符合Java的命名规范。 3. 检查依赖项:在项目的依赖项中,确认已经添加了正确的库依赖项。 如果以上方法都没有解决问题,可以尝试清除并重新编译项目,或者检查是否有其他错误导致了无法正确解析 'SQLiteOpenHelper'。 ### 回答3: 无法解析符号 'SQLiteOpenHelper' 是一种编程错误,通常在使用SQLite数据库的时候会出现。'SQLiteOpenHelper'是一个Android提供的辅助类,用于创建和管理数据库以及数据库版本升级。如果出现该错误,有以下几种可能的原因和解决方法: 1. 缺少引入:在使用SQLiteOpenHelper之前,需要在文件的顶部引入相应的包或类库,如 import android.database.sqlite.SQLiteOpenHelper;。 2. 缺少依赖:在Android项目中,需要在build.gradle文件中添加如下依赖项: ``` implementation 'androidx.sqlite:sqlite:2.1.0' ``` 3. 编译错误:在某些情况下,可能是由于编译错误导致的。可以尝试重新编译项目,或者检查代码中是否有其他语法错误或逻辑错误。 4. Android版本兼容性:某些类可能只能在特定的Android版本中使用。如果当前项目的最小支持版本较低,可能导致该类无法解析的错误。可以尝试升级Android版本或者使用其他兼容的数据库解决方案。 5. 类名错误:检查是否将'SQLiteOpenHelper'拼写错误或大小写错误。确保类名的大小写和拼写与实际的类名完一致。 总结来说,无法解析符号 'SQLiteOpenHelper' 的错误是由于缺少引入、缺少依赖、编译错误、Android版本兼容性或者类名错误等原因导致的。通过引入相应的包、添加正确的依赖、检查编译错误、兼容Android版本或修正类名错误可以解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值