我有一个计算距数据库记录的距离的函数。在一个asp.net页面请求中至少调用此函数两次。在这段时间内,结果不会改变。那么如何缓存结果,我需要在我的应用程序中实现性能。
例如:
public static int GetKilometers(int VehicleID)
{ /*some db query and calculations*/ }
答案 0 :(得分:2)
如果你只关心一页请求的生命周期结果(如你在问题中提到的那样),那么一个简单的局部变量就足够了:
private int? _dist;
public int GetKilometers(int VehicleID)
{
if (_dist == null) {
_dist = /*some db query and calculations*/
}
return _dist;
}
这样可以防止因过度缓存引起的任何内存问题,但仍然可以通过不为同一请求计算两次数据来提高效率。
需要注意的是,您可能不希望这种静态,因为这会将结果缓存到应用程序的多个用户之中。
答案 1 :(得分:1)
要获得快速简便的解决方案,您可以使用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的计算数据相同
将计算数据的数据缓存在数据库中的车辆表中。
无论哪种方式,您对数据库的调用都应检索用户当前请求所需的所有车辆的数据。然后将该数据存储在仅适用于当前请求的局部变量中。如果您要按会话缓存数据,可以使用HttpContext.Session存储SessionId并使用它来从数据库中检索数据。
答案 2 :(得分:1)
从OP的问题来看,所有这些答案都很有用,语法相同,但使用了错误的集合。适当的收集是HttpContext.Current.Items
。将此与@Aaron
答案 3 :(得分:0)
如果肯定没有改变,则使用if条件保存在会话中
if(Session["functionresult"] == null)
{
Session["functionresult"] = functionResult;
}
答案 4 :(得分:0)
如果有那么多计算,那么使用Session会占用你的服务器内存。您可以使用ViewState,但这会使您的页面非常重。
有可能不打db吗?或者最小化到db的往返次数。
类似的东西:
public static int GetKilometers(int [] VehicleID) {/ *一次性获取所有数据* /}