我有兩個存儲過程調用返回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