我以前每次需要员工信息时都会遇到数据库。然后我自学了数据缓存,并从此大大解决了这个问题。
现在,我想把它提升到一个新的水平。我想通过缓存对象实例来减少加载时间。我不确定我是否清楚,所以我会再解释一下。我有一个员工对象(例如清酒)有50个属性。其中一些属性是其他相关对象的通用列表(例如属于该员工的网络资产列表)。因此,当我为员工#30455实例化员工对象时,我不必点击数据库(必要),因为缓存了这么多。
但是,我必须运行属性列表,用来自缓存数据集的数据行中的数据填充它们。我还必须填充我选择包含在头端的通用列表。似乎我应该能够缓存该对象,所以我不必再做所有这些。想法?
答案 0 :(得分:3)
听起来你正试图重新实施NHibernate。这是一项艰巨的任务。 NHibernate通过一级和二级缓存来缓存您在这里谈论的内容。我不确定它是如何在那里实现的,但它们正在使用过期的Session
个对象,通常是在Web请求结束时。通过将对象存储在内存中,可以在给定的Session
内缓存所有内容。
您的数据层是否包含某种类型的基于会话的对象?如果没有,你可以通过一个公共静态字典做一些非常粗略的缓存,你在NHibernate会话的整个生命周期中都会这样做。
答案 1 :(得分:0)
我曾经想到的是使用方法而不是构造函数来实例化员工对象。然后,我可以做点像......
public static Employee getEmployee(int EmployeeId)
{
HttpContext context = HttpContext.Current;
string key = e.ToString() + "_" + EmployeeId;
Employee e = (Employee)context.Session[key];
if (e == null)
{
e = new Employee(EmployeeId);
context.Session[key] = e;
}
return e;
}
......所以我可以......
Employee e = Employee.getEmployee(35440);
我已经在某些地方做过这个,但我从来没有觉得这是最好的方式......似乎更总是使用构造函数实例化。还有更好的方法吗?
答案 2 :(得分:0)
这是我用于我想要实现的目标的模式:
public class Foo
{
private static Dictionary<int, Foo> FooCache = new Dictionary<int, Foo>();
private Foo(int id)
{
// logic for creating/looking up/whatever Foo objects from their ID
// goes here
}
public static Foo CreateFoo(int id)
{
if (!FooCache.ContainsKey(id))
{
FooCache.Add(id, new Foo(id));
}
return FooCache[id];
}
}
您当然可以实现Foo
构造函数和CreateFoo
方法,以便在id
之外采用其他参数(例如,您用于填充的DataRow
对象Foo
对象与。)