跟踪petshop系列一: sqlhelp的参数缓存

SqlHelperParameterCache 类提供了三种可以用来管理参数的公共共享方法。它们是:

  • CacheParameter。用于将 SqlParameters 数组存储到缓存中。
  • GetCachedParameter。用于检索缓存的参数数组的副本。
  • GetSpParameter。一种重载方法,用于检索指定存储过程的相应参数(首先查询一次数据库,然后缓存结果以便将来查询)

缓存和检索参数

通过使用 CacheParameter方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在 Hashtable 中。也就是说hashtable实现了缓存机制.
要从缓存中检索参数,请使用 GetCachedParameter 方法。此方法将返回一个 SqlParameter 对象数组,这些对象已使用缓存中的参数的名称进行了初始化。
注意: 用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameter中检索参数的连接字符串必须与用来通过 CacheParameter来存储这些参数的连接字符串完全相同。

流程如下:
PetShop.SQLServerDAL :

private const string SQL_INSERT_SIGNON = "INSERT INTO SignOn VALUES (@UserId, @Password)";
public AccountInfo SignIn(string userId, string password) {
   SqlParameter[] signOnParms = GetSignOnParameters();  // 调用函数,得到参数数组
   signOnParms[0].Value = userId;
   signOnParms[1].Value = password;
   using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC, CommandType.Text, SQL_SELECT_ACCOUNT, signOnParms))
{
    if (rdr.Read()) {
     AddressInfo myAddress = new AddressInfo(rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9));
     return new AccountInfo(userId, password, rdr.GetString(0), myAddress, rdr.GetString(10), rdr.GetString(11), Convert.ToBoolean(rdr.GetInt32(12)), Convert.ToBoolean(rdr.GetInt32(13)));
    }
    return null;
   }
  }

private static SqlParameter[] GetSignOnParameters() {
   SqlParameter[] parms = SQLHelper.GetCachedParameters(SQL_INSERT_SIGNON);  //看缓存中是否有
   if (parms == null)             //开始调用时空,然后创建
{
    parms = new SqlParameter[] {
              new SqlParameter(PARM_USER_ID, SqlDbType.VarChar, 80),
              new SqlParameter(PARM_PASSWORD, SqlDbType.VarChar, 80)};
    SQLHelper.CacheParameters(SQL_INSERT_SIGNON, parms);    // 调用函数。存入hashtable中,它是用健值对表示的,实现了缓存; 键值是操作数据库的常量字符串
   }
   return parms;
  }
PetShop.SQLServerDAL :
public static readonly string CONN_STRING_NON_DTC = ConnectionInfo.DecryptDBConnectionString(ConfigurationSettings.AppSettings["SQLConnString1"]);
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
public static void CacheParameters(string cacheKey, params SqlParameter[] cmdParms) {
   parmCache[cacheKey] = cmdParms;
  }
   public static SqlParameter[] GetCachedParameters(string cacheKey) {
   SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
   
   if (cachedParms == null)
    return null;
   
   SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

   for (int i = 0, j = cachedParms.Length; i < j; i++)
    clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); //复制一份

   return clonedParms;
  }
总结:
SqlParameter[] signOnParms = GetSignOnParameters();  
第一次调用时,给hashtable赋值。里边德方法全是静态的,是为了提高性能,不用建立对象了,这样就调用方便,唯一的就是消耗内存。等第二次调用时,直接取hashtable中的就行了,实现了重用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值