我正在考虑从Hibernate转移到jOOQ,但我不确定我是否可以不使用缓存。 Hibernate有一个first- and second-level cache。我知道jOOQ确实有support for reusing prepared statements。
如果我使用jOOQ,我是否必须自己处理缓存?
答案 0 :(得分:8)
我提到这一点,因为这种缓存是also possible with Hibernate,在某些情况下可能有意义。
在Hibernate中,查询缓存与二级缓存密切配合。在jOOQ中,您可以实现使用jOOQ VisitListener
API拦截所有查询的查询缓存。有一些关于这个主题的博客文章:
将来会有更好的支持这种类型的缓存(不是在jOOQ 3.7中),因为这种缓存属于SQL API。请注意,您的JDBC驱动程序可能也支持这种缓存 - 例如ojdbc确实。
Hibernate的第一级缓存背后的想法对于更像面向SQL的API(如jOOQ)没有意义。 SQL是一种高度复杂的语言,可以在实际持久化的实体和相同实体的客户端表示之间起作用。这意味着一旦使用SQL,您可能会创建与数据的原始实体表示无关的特殊元组。
换句话说:只有限制查询语言的功能和范围,并且如果您控制 ALL 数据库交互时,才能实现一级缓存Hibernate做到了。 jOOQ明确表示不这样做。
Hibernate中的二级缓存是一个缓存,主要用于主数据和类似类型的数据,从数据库中提取数据几乎没有意义,因为数据不会改变。
没有任何理由,为什么ORM应该实现这种缓存,在简单的情况下不方便。但在许多情况下,最好使用@Cacheable
, e.g. as documented here on this Spring page注释服务方法。这将是更高层上的缓存,而不是ORM /查询层上的缓存,您可以将缓存与业务逻辑更紧密地关联。
答案 1 :(得分:2)
是的,你会的。 jOOQ只是一种类型安全的SQL方法,不进行任何缓存。