【发布时间】:2015-12-17 21:17:50
【问题描述】:
我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。 Hibernate 有一个first- and second-level cache。我知道 jOOQ 确实有support for reusing prepared statements。
如果我使用 jOOQ,我是否必须自己处理缓存?
【问题讨论】:
我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。 Hibernate 有一个first- and second-level cache。我知道 jOOQ 确实有support for reusing prepared statements。
如果我使用 jOOQ,我是否必须自己处理缓存?
【问题讨论】:
我之所以提到这一点,是因为这种缓存是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 / 查询层更高层的缓存,您将能够将缓存与业务逻辑更紧密地关联起来。
【讨论】:
是的,你会的。 jOOQ 只是一种执行 SQL 的类型安全方式,不做任何缓存。
【讨论】: