jOOQ 和缓存?
jOOQ and Caching?
我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。 Hibernate 有一个 first- and second-level cache. I know that jOOQ does have support for reusing prepared statements.
如果我使用 jOOQ,我是否必须自己处理缓存?
是的,你会的。 jOOQ 只是一种类型安全的方式 SQL 并且不做任何缓存。
查询缓存/结果缓存:
我提到这个,因为这种缓存是 also possible with Hibernate,在某些情况下它可能有意义。
在Hibernate中,查询缓存与二级缓存紧密配合。在 jOOQ 中,您可以使用 jOOQ VisitListener
API 实现拦截所有查询的查询缓存。有一些关于这个主题的博客文章:
- Hack up a Simple JDBC ResultSet Cache Using jOOQ’s MockDataProvider
- Caching in Java with JOOQ and Redis
将来会更好地支持这种类型的缓存(jOOQ 3.7 还没有),因为这种缓存属于 SQL API。请注意,您的 JDBC 驱动程序可能也已经支持这种缓存 - 例如ojdbc 确实如此。
一级缓存:
Hibernate 的一级缓存背后的想法对于像 jOOQ 这样更 SQL 导向的 API 没有意义。 SQL 是一种高度复杂的语言,它在实际持久化的实体和相同实体的客户端表示之间工作。这意味着一旦您使用 SQL,您可能会创建与数据的原始实体表示无关的临时元组。
换句话说:一级缓存只有在限制查询语言的功能和范围,并且控制 ALL 的情况下才有可能数据库交互,就像 Hibernate 那样。 jOOQ 明确表示不会那样做。
二级缓存:
Hibernate 中的二级缓存是一种主要用于主数据和类似数据的缓存,因为数据不会更改,因此从数据库中获取数据几乎没有意义。
完全没有理由,为什么ORM要实现这种缓存,在简单的情况下不方便。但在许多情况下,您最好使用 @Cacheable
, e.g. as documented here on this Spring page 注释服务方法。这将是比 ORM / 查询层更高层的缓存,您将能够将缓存与业务逻辑更紧密地关联起来。
我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。 Hibernate 有一个 first- and second-level cache. I know that jOOQ does have support for reusing prepared statements.
如果我使用 jOOQ,我是否必须自己处理缓存?
是的,你会的。 jOOQ 只是一种类型安全的方式 SQL 并且不做任何缓存。
查询缓存/结果缓存:
我提到这个,因为这种缓存是 also possible with Hibernate,在某些情况下它可能有意义。
在Hibernate中,查询缓存与二级缓存紧密配合。在 jOOQ 中,您可以使用 jOOQ VisitListener
API 实现拦截所有查询的查询缓存。有一些关于这个主题的博客文章:
- Hack up a Simple JDBC ResultSet Cache Using jOOQ’s MockDataProvider
- Caching in Java with JOOQ and Redis
将来会更好地支持这种类型的缓存(jOOQ 3.7 还没有),因为这种缓存属于 SQL API。请注意,您的 JDBC 驱动程序可能也已经支持这种缓存 - 例如ojdbc 确实如此。
一级缓存:
Hibernate 的一级缓存背后的想法对于像 jOOQ 这样更 SQL 导向的 API 没有意义。 SQL 是一种高度复杂的语言,它在实际持久化的实体和相同实体的客户端表示之间工作。这意味着一旦您使用 SQL,您可能会创建与数据的原始实体表示无关的临时元组。
换句话说:一级缓存只有在限制查询语言的功能和范围,并且控制 ALL 的情况下才有可能数据库交互,就像 Hibernate 那样。 jOOQ 明确表示不会那样做。
二级缓存:
Hibernate 中的二级缓存是一种主要用于主数据和类似数据的缓存,因为数据不会更改,因此从数据库中获取数据几乎没有意义。
完全没有理由,为什么ORM要实现这种缓存,在简单的情况下不方便。但在许多情况下,您最好使用 @Cacheable
, e.g. as documented here on this Spring page 注释服务方法。这将是比 ORM / 查询层更高层的缓存,您将能够将缓存与业务逻辑更紧密地关联起来。