首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC查询缓存和预缓存

JDBC查询缓存和预缓存
EN

Stack Overflow用户
提问于 2014-11-11 02:17:31
回答 3查看 1.1K关注 0票数 2

场景:

我需要在我的web服务中缓存数据库查询的结果。在一个服务调用周期中,大约有30个表被查询。我确信服务将频繁访问某个日期范围内的数据,并且我希望预缓存这些数据。这意味着在应用程序启动时缓存大约800,000行,数据是只读的。数据不需要动态刷新,这是参考数据。缓存不能在每次服务调用时都加载,因为数据太多了。这个“常用”窗口之外的数据不是时间关键型的,可以延迟加载。大多数查询将返回1行,并且这些表都没有彼此的父/子关系,尽管会有一些连接。不需要动态sql支持。

选项:

我打算使用myBatis,但是没有一个好的方法来预热缓存。myBatis无法理解服务查询select * from table where key = ?已被启动预缓存查询select * from table覆盖。

据我所知(文档重载),Hibernate也有同样的问题。此外,这些表设计了组合键,而没有主键,这对Hibernate来说是一个额外的麻烦。

问题:

首选:这个问题有没有myBatis解决方案?我很想用它。(熟悉度、简洁性、性能、有趣的名字等)

或者:是否有ORM或DB友好的缓存可以提供我想要的东西?

EN

回答 3

Stack Overflow用户

发布于 2014-11-21 03:21:16

您可以使用分布式缓存解决方案,如NCacheTayzgrid,它们提供索引和查询功能以及缓存启动加载器。

您可以在缓存中的实体属性上配置索引。可以将cache startup loader配置为在缓存启动时从缓存中的数据库加载所有数据。加载数据时,缓存将为内存中的所有实体创建索引。

Object Query Language (OQL)特性提供了类似于SQL的查询,可以用来查询内存中的数据。

票数 1
EN

Stack Overflow用户

发布于 2014-11-11 03:27:57

第三方产品(免费和付费)的选择范围太广,太依赖于您的特定需求和操作能力,无法在这里尝试“回答”。

但是,我将建议使用一种替代显式缓存只读数据的方法。

您显然相信,您的数据集的内存占用空间将适合一个大小合理的服务器上的RAM。我的建议是直接使用数据库引擎(没有额外的外部缓存),但将数据库配置为足够大的内部缓存来容纳整个数据集。如果您的所有数据都驻留在数据库服务器的RAM中,则可以非常快速地访问这些数据。

我已经在mySQL中成功地使用了这种技术,但我希望所有主要的数据库引擎都能使用这种技术。如果您不知道如何正确地配置您选择的数据库,我建议您遵循ask一个单独的、详细的问题。

您可以在启动系统时通过执行代表性查询来预热缓存。这些查询将相对较慢,因为它们必须实际执行磁盘I/O,以将相关数据块拉入缓存。访问相同数据块的后续查询将会快得多。

这种方法应该会在不增加代码或操作环境复杂性的情况下给您带来巨大的性能提升。

票数 0
EN

Stack Overflow用户

发布于 2014-11-15 04:52:01

Sormula可能想要你想要的。您需要为每个要缓存的POJO添加注释,如下所示:

代码语言:javascript
复制
@Cached(type=ReadOnlyCache.class)
public class SomePojo {
...
}

通过为每个对象调用selectAll方法来预先填充缓存:

代码语言:javascript
复制
Database db = new Database(one of the JNDI constructors);
Table<SomePojo> t = db.getTable(SomePojo.class);
t.selectAll();

关键是缓存存储在Table对象t中,因此您需要保留对t的引用,并在后续查询中使用它。或者在许多表的情况下,保持对数据库对象db的引用,并使用db.getTable(...)获取要查询的表。

请参阅org.sormula.tests.cache.readonly包中的javadoc和测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26850275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档