我想使用这种模式:
SqlCommand com = new SqlCommand(sql, con); com.CommandType = CommandType.StoredProcedure;//um com.CommandTimeout = 120; //com.Connection = con; //EDIT: per suggestions below SqlParameter par; par = new SqlParameter("@id", SqlDbType.Int); par.Direction = ParameterDirection.Input; com.Parameters.Add(par); HttpContext.Current.Cache["mycommand"] = com;
显然,我不想遇到奇怪的问题,比如人A从缓存中检索这个问题,更新param1,人2从缓存中获取它,并更新param2和运行命令的每个用户混合使用两者.
克隆从缓存中取出的命令可能比从头开始创建新命令更昂贵.
ASP.NET缓存的线程安全性如何?我错过了任何其他潜在的陷阱吗?尽管存在线程问题,这种技术是否适用于无参数命令?
Clarefication:如果我想用脚比喻自己,我该如何瞄准?有没有办法锁定对缓存中对象的访问权限,以便访问序列化?
很简单:不要.如果你看不出这是错的,你需要阅读更多关于ADO.NET的内容.有很多文献解释了正确的方法:只需在需要时创建连接和命令,并确保正确处理它们.
缓存本身是线程安全的,但不会对放在其中的对象赋予线程安全性.SqlCommand对象不是线程安全的,因此不是您想要缓存的东西.
在这种情况下最重要的是缓存为您处理的连接,您不应该自己尝试照顾它.
与执行相比,命令对象(即使是具有许多参数的命令对象)的创建仍将是花生.除非您有证据,否则不要尝试缓存它们.
您项目面临的最大风险是过早优化.