SQLHelper.GetCachedParameters方法之缓存

老习惯还是先把GetCachedParameters这个函数的代码贴出来。

复制代码
  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;
        }
复制代码

这里涉及到了一个哈希表hastTable定义了parmCache来存储缓存的。那它到底是怎样的一种机制呢?我自己认真的分析了下代码,

GetCachedParameters这个函数是它缓存都是空的也就是说return null。就拿库存Inventory来说吧,得到parm空后

就只能自己new Sqlparmeter了,显然这样比较耗内存。还是看下Invertory此时是怎样new Sqlparmeter吧:

复制代码
1 privatestatic SqlParameter[] GetInventoryParameters(int i) {
2 SqlParameter[] parms = SqlHelper.GetCachedParameters(SQL_TAKE_INVENTORY + i);
3
4 if (parms ==null) {
5 parms =new SqlParameter[] {
6 new SqlParameter("@Quantity"+ i, SqlDbType.Int),
7 new SqlParameter("@ItemId"+i, SqlDbType.VarChar, 10)};
8
9 SqlHelper.CacheParameters(SQL_TAKE_INVENTORY + i, parms);
10 }
11
12 return parms;
13 }
复制代码

从第四行开始就是第一次更新要新建缓存的代码了。之前我一直在想,为什么Invertory中的TakeStock函数更新时是这样找缓存的:

 SqlParameter[] inventoryParms;

 foreach (LineItemInfo item in items) {
     inventoryParms = GetInventoryParameters(i);

     i++;

 }

而这个GetInventoryParameters(i)调用SqlHelper.GetCachedParameters(SQL_TAKE_INVENTORY + i)是明显有加了一句

SQL_TAKE_INVENTORY了。这是为什么呢?我猜想SQL_TAKE_INVENTORY+i这又意义吗?

后来想想还是觉得这样做的好处是可以在hastTable中唯一标识一个Key吧,hastTable只能通过这个key来查找缓存。

但是问题又来呢。在SQLHelper.GetCachedParameters传递parameter参数的时候为什么好克隆一个parameter参数呢?

网上有人这样解释:

1、为什么要使用Clone方法返回SqlParameter[],作用是什么?
    ==========防止你调用后改变缓存中存在的参数。

2、直接返还就是引用,克隆返还的对象--操作内存,不同的调用者给不同的值。

这接调用怎么会改变缓存中的参数呢?缓存中的参数不是已经在hastTable中了吗?我们每次调用的时候不是都有唯一的标识吗?

这样怎么会改变缓存中的参数?我不理解。

posted @   小霖2012  阅读(1144)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示