我有两个存储过程调用返回User
实体。通过包含在用户实体中的两个参数而不是来查看用户是否注册。如果该过程没有返回任何用户,则会调用第二个存储过程来注册该用户。Eclipselink为存储过程禁用缓存
我看到的行为是,当按此顺序调用时,第二个存储过程从缓存中返回一个User
实体,该实体几乎包含所有字段为空的缓存。当我禁用缓存时,它会适当地返回用户对象。看起来第一个调用是缓存用户对象。
在用户登录的正常操作中,我希望它缓存,所以我不想在第一次调用时禁用缓存。我想第二次存储过程调用不使用缓存。在做了一些研究和测试一些选项后,我发现了几个选项。
这不会对存储过程的工作:
proc.setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
java.lang.IllegalArgumentException: Query linkUser, query hint javax.persistence.cache.retrieveMode is not valid for this type of query.
这看起来像驱逐所有所有用户的缓存。
em.getEntityManagerFactory().getCache().evict(User.class);
而且these选项无论是实体的还是整个应用程序的所有实例禁用缓存。
如何使用Eclipselink对单个存储过程调用不使用缓存?
奖励:为什么要缓存返回空用户的存储过程调用?
第一个SP调用不会返回部分的实体,则返回null。这两个查询参数甚至不是实体的一部分。我现在试图弄清楚缓存中的任何事情,以及为什么在调用之前移除缓存的实体可以解决问题。 – blur0224