最近在看Microsoft的PetShop,在SQLServerDAL项目中有一个类SQLHelper.cs,其中定义了一个变量:
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());(方式一)
此变量用来缓存SQL中的参数,但我不知道上面的方式和下面的方式
private static Hashtable parmCache = 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;
}
我特别想知道如果用(方式二)的话,会出现什么错误!如果不会出错的话,多余的加锁会降低性能.可我也做了些多线程的测试,也没有出现什么错误或异常.希望得到高手的指点!
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());(方式一)
此变量用来缓存SQL中的参数,但我不知道上面的方式和下面的方式
private static Hashtable parmCache = 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;
}
我特别想知道如果用(方式二)的话,会出现什么错误!如果不会出错的话,多余的加锁会降低性能.可我也做了些多线程的测试,也没有出现什么错误或异常.希望得到高手的指点!
解决方案 »
- Finalize的重写问题
- winform里如何捕捉窗体中所有的mousedown事件呢,包括groupbox里的?
- 用C# 如何切换 windows 的“文件夹选项 -> 查看 -> 任务 -> "在文件文件夹中显示常见任务、使用windows 传统风格的文件夹"”
- oracle数据链接需要每次操作后都断开吗
- 结友朋友,一起探讨程序员的人生以及各种技术问题,希望各位积极参与!
- 好问题不要沉
- object x; x=1;这个操作应该看成是一个装箱操作吗?那么x存储在heap还是stack中呢?
- PostMessage模拟输出按键
- 文件记录的问题,是否有类似与DELPHI中的(file of 记录 )类型!
- 如何使用jmail组件??
- Radiobuttonlist的问题
- 史上最简单的填空题,散分
如果没有任何线程在读取 Hashtable,则 Synchronized 支持使用多个写入线程。如果使用一个或多个读取器以及一个或多个编写器,则同步包装不提供线程安全的访问。