如何强制 spring 数据先在缓存中查找 CrudRepository 的 findAll 方法的实体,然后才在数据源中查找实体
How to force spring data to find entities for findAll method of CrudRepository in cache first, and only after in data sources
我已将 ehcache 配置为与 hibernate 一起工作,并将 hibernate 与 spring-data 一起工作,并且所有框架都可以正常协同工作。例如,当我使用 CrudRepository class 的方法 'T findOne(ID var1);' 时,一切正常,并且值是从缓存中获取的。
我希望这种行为应该适用于方法 'Iterable findAll(Iterable var1);' 因为它应该很容易检查每个特定的 id,如果它存在于缓存中,然后根据已经存在的 id 形成查询在缓存中找到,哪些不在。
例如,如果我在缓存中有 id 为 {1,2,3} 的项目,并且我尝试调用 findAll({1,3,4,5}),查询应该只包含 {4,5}。此外,如果我调用 findAll({1,3}) - 根本不应该对数据源进行查询,并且所有数据都应该从缓存中获取。
这些是我的期望。然而实际上 spring-data 总是形成完整的请求,即使所有的 id 都已经在缓存中。对如何强制执行预期行为有什么建议吗?
ps:我知道,我可以缓存查询,但是这种情况完全不同,我不想按参数缓存查询,我希望参数列表被视为单独的项目,这可以单独从缓存中取出(但如果有些项目需要查询,应该一次查询完成,不要多次!)
基本的 spring-data jpa 存储库似乎是不可能的(jpa 目前没有 API 用于通过多个 id 获取)。
不过你可以试试
- 扩展您的 jpa 存储库 (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations),
- 从 EntityManager 解包休眠会话 (https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#unwrap-java.lang.Class-)
- 并使用Session.byMultipleIds方法
(https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html#byMultipleIds-java.lang.Class-)。
当然,如果您使用的是 Hibernate 5.1+。
它应该使用 MultiIdentifierLoadAccess.with 方法管理二级缓存 (https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/MultiIdentifierLoadAccess.html#with-org.hibernate.CacheMode-)
希望对您有所帮助。
我已将 ehcache 配置为与 hibernate 一起工作,并将 hibernate 与 spring-data 一起工作,并且所有框架都可以正常协同工作。例如,当我使用 CrudRepository class 的方法 'T findOne(ID var1);' 时,一切正常,并且值是从缓存中获取的。
我希望这种行为应该适用于方法 'Iterable findAll(Iterable var1);' 因为它应该很容易检查每个特定的 id,如果它存在于缓存中,然后根据已经存在的 id 形成查询在缓存中找到,哪些不在。 例如,如果我在缓存中有 id 为 {1,2,3} 的项目,并且我尝试调用 findAll({1,3,4,5}),查询应该只包含 {4,5}。此外,如果我调用 findAll({1,3}) - 根本不应该对数据源进行查询,并且所有数据都应该从缓存中获取。
这些是我的期望。然而实际上 spring-data 总是形成完整的请求,即使所有的 id 都已经在缓存中。对如何强制执行预期行为有什么建议吗?
ps:我知道,我可以缓存查询,但是这种情况完全不同,我不想按参数缓存查询,我希望参数列表被视为单独的项目,这可以单独从缓存中取出(但如果有些项目需要查询,应该一次查询完成,不要多次!)
基本的 spring-data jpa 存储库似乎是不可能的(jpa 目前没有 API 用于通过多个 id 获取)。
不过你可以试试
- 扩展您的 jpa 存储库 (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations),
- 从 EntityManager 解包休眠会话 (https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#unwrap-java.lang.Class-)
- 并使用Session.byMultipleIds方法 (https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html#byMultipleIds-java.lang.Class-)。
当然,如果您使用的是 Hibernate 5.1+。
它应该使用 MultiIdentifierLoadAccess.with 方法管理二级缓存 (https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/MultiIdentifierLoadAccess.html#with-org.hibernate.CacheMode-)
希望对您有所帮助。