jOOQ and Caching?



我正在考虑从Hibernate迁移到jOOQ,但我不确定是否可以不使用缓存。Hibernate有一级和二级缓存。我知道jOOQ确实支持重用预处理语句。

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

查询缓存/结果缓存:

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

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

    使用jOOQ的MockDataProvider创建一个简单的JDBC ResultSet缓存在Java中使用JOOQ和Redis缓存
在未来会有更好的支持这种类型的缓存(不是在jOOQ 3.7中,但是),因为这种类型的缓存属于SQL API。请注意,您的JDBC驱动程序可能也已经支持这种缓存了——例如ojdbc就支持。

一级缓存:

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

换句话说:一级缓存只有在限制查询语言的功能和作用域,并且像Hibernate那样控制所有数据库交互的情况下才有可能实现。jOOQ明确不这样做。

二级缓存:

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

没有任何理由,为什么一个ORM应该实现这种缓存,在简单的情况下缺乏便利。但是在很多情况下,你最好使用@Cacheable来注释一个服务方法,例如在这个Spring页面上所记录的。这将是在比ORM/查询层更高的层上的缓存,在ORM/查询层上,您将能够将缓存与业务逻辑更紧密地关联起来。

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

最新更新