jOOQ和缓存?

我正在考虑从Hibernate转移到jOOQ,但我不确定如果没有缓存我是否可以做到。 Hibernate有一级和二级缓存 。 我知道jOOQ确实支持重用预准备语句 。

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

查询缓存/结果缓存:

我之所以提到这一点,因为Hibernate也可以使用这种缓存,在某些情况下它可能是有意义的。

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

  • 使用jOOQ的MockDataProvider破解简单的JDBC ResultSet缓存
  • 使用JOOQ和Redis在Java中缓存

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

一级缓存:

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

换句话说:只有在限制查询语言的function和范围时才能实现第一级缓存,如果您控制所有数据库交互,那么Hibernate就是这样做的。 jOOQ明确表示不这样做。

二级缓存:

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

没有任何理由,为什么ORM应该实现这种缓存,在简单的情况下不方便。 但在许多情况下,最好使用@Cacheable注释服务方法,例如,如本春页页面所述 。 这将是更高层上的缓存,而不是ORM /查询层上的缓存,您可以将缓存与业务逻辑更紧密地关联。

是的你将会。 jOOQ只是一种类型安全的SQL方法,不进行任何缓存。