【问题标题】:jOOQ and Caching?jOOQ 和缓存?
【发布时间】:2015-12-17 21:17:50
【问题描述】:

我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。 Hibernate 有一个first- and second-level cache。我知道 jOOQ 确实有support for reusing prepared statements

如果我使用 jOOQ,我是否必须自己处理缓存?

【问题讨论】:

    标签: java caching jooq


    【解决方案1】:

    查询缓存/结果缓存:

    我之所以提到这一点,是因为这种缓存是also possible with Hibernate,在某些情况下可能有意义。

    在 Hibernate 中,查询缓存与二级缓存密切合作。在 jOOQ 中,您可以使用 jOOQ VisitListener API 实现一个查询缓存来拦截所有查询。有一些关于这个主题的博客文章:

    将来会更好地支持这种类型的缓存(jOOQ 3.7 中还没有),因为这种缓存属于 SQL API。请注意,您的 JDBC 驱动程序也可能已经支持这种缓存 - 例如ojdbc 可以。

    一级缓存:

    Hibernate 的一级缓存背后的想法对于像 jOOQ 这样更面向 SQL 的 API 来说是没有意义的。 SQL 是一种高度复杂的语言,它在实际持久化的实体和相同实体的客户端表示之间工作。这意味着一旦使用 SQL,您可能会创建与数据的原始实体表示无关的临时元组。

    换句话说:只有在您限制查询语言的功能和范围,并且如果您控制所有您的数据库交互时,第一级缓存才是可能的。休眠做到了。 jOOQ 明确不这样做。

    二级缓存:

    Hibernate 中的二级缓存主要用于处理主数据和类似类型的数据,因为数据不会改变,因此从数据库中获取数据几乎没有意义。

    完全没有理由,为什么 ORM 应该实现这种缓存,在简单的情况下缺乏便利性。但在许多情况下,最好使用@Cacheable, e.g. as documented here on this Spring page 注释服务方法。这将是比 ORM / 查询层更高层的缓存,您将能够将缓存与业务逻辑更紧密地关联起来。

    【讨论】:

    • 感谢您的出色回答!它对我的决策有很大帮助!
    • @StefanFalk:不客气。我希望这将是一个有利于 jOOQ 的决定:)
    • 就我个人而言,我倾向于使用 jOOQ,但这对我来说仍然是一个艰难的决定,因为我不知道 Hibernate 在我使用它时实际上减轻了我多少工作量。我正在“重构一个我已经工作了半年的项目,但我不再孤单。我让自己负责后端,我不想搞砸事情本周我将使用 jOOQ 来创建 Java 文件,我将实现一些 Repositories 和 Services 来测试它并感受一下:)
    • 但是你有没有机会知道 github/bucket/etc 上的一些项目。哪个使用jOOQ?如果有的话,我会对阅读一些现有项目的代码感兴趣。 :)
    • @StefanFalk:jOOQ 不是 Hibernate 的直接替代品。这两个 API 解决了不同的问题。 This blog post might be interesting for you。此外,您不必做出决定。您可以同时使用两者。 Here's how to write type safe native SQL queries to query entities in Hibernate, with jOOQ。一些 OSS 示例项目包括:github.com/rancher/cattlegithub.com/torodb/torodb
    【解决方案2】:

    是的,你会的。 jOOQ 只是一种执行 SQL 的类型安全方式,不做任何缓存。

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2013-06-20
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多