2011-12-01 66 views
0

我想知道是否应该以某种方式缓存从我的DAL返回的对象?我可能有多个UI控件在页面的单个负载中调用相同的数据。缓存DAL返回对象?

你们会推荐什么?我开始谨慎一点吗?它不是一个可怕的数据量。但是,如果我应该以某种方式进行缓存,那么推荐的方法是什么?

+0

如果你有性能问题,而不是因为有人这样说,你需要缓存... –

+1

@DanielHilgarth我不同意。您可以留意未来,而不是不必要地做20个电话来获取用户ID。他也可能超载数据库而不知道它,但是没有性能问题。 –

+0

那么我一直在遇到一些奇怪的性能问题,但我还不确定这是由于对数据库的多次调用。调试抓取数据时需要几毫秒。但它在名单上正在消除。然而,正如你所说的尤里,在对数据库的呼叫方面规划未来并没有什么坏处。 – Nugs

回答

1

你可能cache如果你真的在同一页面上有多个控件使用相同的数据,你可以在父页面调用一次数据,并在每个控件中使用Setter将引用传递给每个控件(而不是让每个控制器从DAL本身拉出相同的数据),例如:

myControl.AllUsers = _allUsers; 
.... 
myOtherControl.AllUsers = _allUsers; 

我也同意@DanielHilgarth。缓存增加了复杂性(例如,何时刷新缓存)。无论如何,如果页面加载速度很快,我不会打扰。

如果页面很慢,循环中的数据库调用通常是我的经验的罪魁祸首。

+0

感谢这是我要采取的方法,它似乎工作得很好。我打算从父页面调用一次数据(并在稍后需要时将其缓存在父页面上),并将填充的对象传递给所有控件,而不是让控件独立调用它们。我认为这将大大优化页面,并让我避免在DAL内缓存一些复杂性。 – Nugs

0

这取决于它是否安全并且必要时这样做。如果您正在使用的数据不需要实时数据(即您的博客),那么如果您觉得这样做是必要的(意思是您的网站运行缓慢),那么通过一切手段缓存。

高速缓存的一个问题是,如果需要立即响应(例如禁止用户或更新支付网关信息)的事情,人们很多时候会忘记要求清除缓存。

有两种主要类型的缓存,滑动缓存和固定时间缓存。

滑动缓存(每次执行有效检索时得到扩展的缓存)对于计算相对容易的值但可能会受到数据库/网络开销影响的资源非常适用。在滑动高速缓存上缓存1小时(或永远),然后在DAO发生INSERT/UPDATE/DELETE时手动使缓存无效(移除)。通过这种方式,用户将看到实时结果,但实际上只要有可能就会被缓存。

固定时间缓存适用于难以执行的资源(即非常复杂的存储过程),并且不需要实时准确性。在首次请求时缓存1小时(或永远),并且在第一个小时到达之前不要清除缓存。 INSERT/UPDATE/DELETE被你的缓存机制忽略(除非它是绝对必要的)。

+0

谢谢马修。这实际上可能是一个5秒的缓存。这是我正在使用的实时数据,但我最担心的是一次调用数据的单个页面可能需要10次。如果我可以将第一个响应缓存几秒钟,那么所有后续对同一页面数据的后续调用将更快,并且数据库将只需处理1个数据调用。 – Nugs

+0

它是一个单一的页面〜请求〜?如果是这样,只需将其保存在本地变量中,并在数据应该保持不变的情况下重用该变量。无论如何,如果你仍然想实现某种缓存,那么滑动缓存机制对此最好。 – Matthew

0

要做到这一点,你可以看看这个库:

http://www.reactiveui.net/

它提供了一个整洁的干净的方式来缓存你的对象。

我会说这是一个非常整洁的方式。