我有一个计算距离数据库记录的函数。此函数在一个asp.net页面请求中至少被调用两次。在这段时间内,结果不会改变。那么如何缓存结果,我需要在我的应用程序中提高性能。
例如:
public static int GetKilometers(int VehicleID)
{ /*some db query and calculations*/ }发布于 2010-03-02 21:55:20
如果您只关心一个页面请求的生命周期内的结果(正如您在问题中提到的),那么一个简单的局部变量就足够了:
private int? _dist;
public int GetKilometers(int VehicleID)
{
if (_dist == null) {
_dist = /*some db query and calculations*/
}
return _dist;
}这将防止过度缓存引起的任何内存问题,但由于不会为同一请求计算两次数据,因此仍具有一定的效率。
需要注意的一点是,您可能不希望使用这种静态方法,因为这样会在应用程序的多个用户之间缓存结果。
发布于 2010-03-02 21:48:05
为了快速方便地解决问题,您可以使用HttpContext.Session对象来存储如下所示的值:
int distance;
if(Session["distance"] == null)
{
distance = GetKilometers(vehicleId);
Session["distance"] = distance;
}
else
{
distance = Convert.ToInt32(Session["distance"]);
}为了让它更简单,你可以把它抽象成它自己的方法。
编辑
上面的解决方案适用于数据量最小的情况。考虑到在您的案例中将存储大量数据,我认为有两种可能的情况:
对于每个用户,车辆X的计算数据是不同的
使用UserId (或SessionId)、VehicleId和CalculatedData将计算数据缓存在数据库中的单独表中。
对于任何需要车辆X的数据的用户,车辆X的计算数据都是相同的
将计算数据缓存在数据库的vehicle表的列中。
无论哪种方式,您对数据库的调用都应该检索用户当前请求所需的所有车辆的数据。然后将该数据存储在一个局部变量中,该变量仅为当前请求而存在。如果您打算按会话缓存数据,则可以使用HttpContext.Session存储SessionId,并使用它从数据库中检索数据。
发布于 2010-03-02 22:06:38
从OP的问题来看,所有这些答案都是有用的,语法是相同的,但使用了错误的集合。合适的集合是HttpContext.Current.Items。把这个和@Aaron的答案结合起来
https://stackoverflow.com/questions/2363470
复制相似问题