我正在考虑从 Hibernate 迁移到 jOOQ,但我不确定是否可以不使用缓存。休眠有一个一级、二级缓存 https://stackoverflow.com/questions/337072/what-are-first-and-second-level-caching-in-hibernate。我知道 jOOQ 确实有支持重用准备好的语句 http://www.jooq.org/doc/3.6/manual/sql-execution/reusing-statements/.
如果我使用 jOOQ,我是否需要自己处理缓存?
查询缓存/结果缓存:
我提到这一点是因为这种缓存是也可以使用 Hibernate http://apmblog.dynatrace.com/2009/02/16/understanding-caching-in-hibernate-part-two-the-query-cache/,并且在某些情况下可能有意义。
在Hibernate中,查询缓存与二级缓存紧密配合。在jOOQ中,您可以实现一个查询缓存,拦截所有使用jOOQ的查询VisitListener
API。有一些关于此主题的博客文章:
- 使用 jOOQ 的 MockDataProvider 破解一个简单的 JDBC 结果集缓存 http://blog.jooq.org/2015/03/26/hack-up-a-simple-jdbc-resultset-cache-using-jooqs-mockdataprovider
- 使用 JOOQ 和 Redis 在 Java 中进行缓存 http://aakashjapi.com/caching-with-jooq-and-redis
将来将会更好地支持这种类型的缓存(尚未在 jOOQ 3.7 中),因为这种缓存属于 SQL API。请注意,您的 JDBC 驱动程序可能也已经支持这种类型的缓存 - 例如ojdbc 可以。
一级缓存:
Hibernate 一级缓存背后的想法对于像 jOOQ 这样更面向 SQL 的 API 来说没有意义。 SQL 是一种高度复杂的语言,它在实际持久化实体和相同实体的客户端表示之间工作。这意味着一旦您使用 SQL,您可能会创建与数据的原始实体表示无关的临时元组。
换句话说:只有限制查询语言的功能和范围,并且控制ALL你的数据库交互,就像 Hibernate 的方式一样。 jOOQ 明确不这样做。
二级缓存:
Hibernate 中的二级缓存主要用于主数据和类似类型的数据,在这些数据中从数据库获取数据几乎没有意义,因为数据不会更改。
ORM 完全没有理由实现这种缓存,因为在简单情况下不方便。但在许多情况下,您最好用以下方式注释服务方法@Cacheable,例如如本 Spring 页面上所述 https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support。这将是比 ORM/查询层更高的层上的缓存,您将能够将缓存与业务逻辑更紧密地关联起来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)