2012-05-30 67 views
0

我只使用Hibernate及其L1(会话)高速缓存。我想知道是否可以预先填充它。预填充Hibernate L1高速缓存

假设我有一个Item表,每个项目都有自己的id,我需要发出查询,如“from Item where id = :id”:如果我能预先加载一次我能有更快的响应时间的所有项目(I”从Tomcat下的Servlet中使用Hibernate)。

+0

会话高速缓存是一个非常短暂的高速缓存,其生存期通常是单个事务的生命周期:几毫秒,并且不在多个并发线程之间共享。如果您需要在交易中通过ID获取几乎所有物品,那么是的,您可以预先加载所有物品。否则,我不明白这一点。 –

+0

阅读这篇文章(https://community.jboss.org/wiki/UsingHibernateWithTomcat),我了解到应该让一个会话在Servlet的整个生命周期中保持打开状态,这个持续时间可能会持续几秒钟...... – cdarwin

+0

我无法访问这篇文章,但是这里是官方hibernate文档中关于Session的内容:*表示应用程序和持久性存储之间的对话的单线程,短期对象。包装一个JDBC java.sql.Connection。* –

回答

-1

是的,这是可能的。您将执行一次选择(没有where条件并且没有使用结果列表),然后数据在会话的第一级缓存中,直到您清除会话或将其丢弃。

但是在这种情况下,如果会话本身抛出缓存中的预加载数据(这不是一个功能问题,只是性能问题,而且我有这种感觉,使用从不这样做)。如果你想完全控制,你可以将预加载的数据存储在一个静态变量(一个List或Map实例)中,然后编写一个从该静态变量读取数据的服务。顺便说一句,在你的环境中,对这个静态变量的访问必须是同步的。

+4

这是一个非常危险的事情,因为你可能会返回陈旧的数据。如果要缓存多个会话/事务的项目,最好使用Hibernate的二级缓存:它将是透明的,并且在项目被修改时会被更新。为什么重新发明轮子? –

+0

如果将它缓存为只读,则不会造成危险(请注意,延迟加载,即全部加载或不关闭会话)。关闭会话后的修改是不可能的,不同线程同时修改(都属于同一个会话,并且hibernate会话不是线程安全的)。但这一切都是由L1高速缓存的问题所暗示的。 – Johanna

+0

我指的是将预先加载的数据存储在静态List或Map中的建议。你最好使用L2 chache而不是实现你自己的。 –