java - JDBC 查询缓存和预缓存

标签 java hibernate caching orm mybatis

场景:

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

选项:

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

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

问题:

首选:这个问题有myBatis的解决方案吗?我非常愿意使用它。 (熟悉度、简单性、性能、有趣的名字等)

或者:是否有 ORM 或 DB 友好的缓存可以提供我正在寻找的东西?

最佳答案

您可以使用类似 NCache 的分布式缓存解决方案或 Tayzgrid它提供索引和查询功能以及缓存启动加载程序。

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

Object Query Language (OQL)功能,它提供类似于 SQL 的查询,然后可用于查询内存中的数据。

关于java - JDBC 查询缓存和预缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26850275/

相关文章:

java - 为什么Hamcrest `matches`方法使用Object作为输入类型而不使用泛型类型作为输入

java - 数据截断 : Data to long for column

java - 在基于 Spring MVC 的应用程序中,我应该何时何地从 hibernate 4.3.8.Final 获取新 session ?

caching - 缓存和记忆化有什么区别?

java - 为什么在 CDI 中使用构造函数而不是 setter 注入(inject)?

java - 如何使用占位符在 Bootstrap 模型中显示的文本框中设置值

java - Solr 搜索查询区分大小写

hibernate - BigDecimal 0.000 到 0

c# - ServiceStack ApiKeyAuthProvider 在每个请求上触发 6 个选择语句

html - 结合 HTML5 localStorage 和本地数据库以获得更多空间?