我是ehcache的新手,我似乎无法找到我需要的东西。
我正在使用hibernate并且有一个大表(500k +项)我需要快速查询。
用户需要在页面中对此表进行retrevial,按4个不同的属性排序。我的方法是对这个表进行预先排序,并将它们存储在4个不同的缓存列表中。用户还可以搜索此表。
我该怎么做?我希望自动从数据库中预取和更新数据。
答案 0 :(得分:0)
有趣的问题,实际上Hibernate提供了开箱即用的所有功能,但是机制有点复杂。首先,您需要二级缓存(L2)。它通过id将每条记录存储为单个项目。这意味着您可以轻松地通过id查询对象,而无需触及数据库。
仅此一点对您没有帮助,而查询缓存就在这里发挥作用。假设您有类似的查询:
SELECT c1, c2, c3, c4
FROM table
ORDER BY c1 ASC
LIMIT 100,20
第一次执行此查询时,Hibernate会针对数据库运行此命令,但它也会将所有返回的记录存储在L2中,并将结果本身(id列表)存储在查询缓存中。下次执行完全相同的查询时,Hibernate会在查询缓存中找到id列表,然后从L2逐个获取每条记录。
如果使用略有不同的查询,Hibernate将运行SQL并将结果存储在不同的密钥下。它使用单独的缓存进行查询缓存,密钥通过连接查询和所有参数形成。
我不确定Hibernate是否会将完整结果存储在缓存中并在内存中应用分页,或者它可能会单独存储单个页面,因此每个查询将在缓存中包含尽可能多的不同页面的元素。如果你走这条路,如果你能够启发我就会很棒。
另请注意,通过Hibernate对此表中的任何行进行的任何修改都将使涉及此表的所有缓存无效。 BTW 500K不是那么大的表;-)。如果每条记录占用1 KiB,那么将整个数据库保留在内存中可能是值得的。
答案 1 :(得分:0)
500K记录无论如何都不是一张大表。
通过充分配置数据库(和底层操作系统),您可能会获得最大的性能,以便您的表和必要的索引适合(并留在)缓存数据库端。
Hibernate的二级缓存+查询缓存在这里没有多大帮助,特别是对于必须以各种方式进行分页和排序的可变数据。