2017-05-05 69 views
0

我知道mybatis有緩存,當默認執行更新的時候它會刷新緩存。那麼當執行select ... for update時,它會刷新緩存嗎?如果答案是否定的,那麼如果我首先執行選擇,然後立即執行select ... for update,那麼mybatis將訪問數據庫或擊中高速緩存?當執行select my ... mybatis flush cache時默認更新嗎?

回答

0

緩存刷新默認行爲與實際執行的SQL,但是執行的語句的類型爲Mybatis

無論SQL是<select>@Select然後在不指定flushCache屬性(進入@Options用於註釋風格),默認行爲適用:沒有沖水。並且對於<update>@Update緩存默認是刷新的。

無論如何,你的情況下,SELECTSELECT FOR UPDATE是不同的SQL字符串,然後當調用兩者時,即使結果集相同,數據庫也會被命中,緩存將SQL字符串和參數關聯到結果。更改SQL字符串=>新命中,更改參數=>新命中。如果語句<select id=stmt1>和另一個語句<select id=stmt2>產生相同的SQL字符串並且使用相同的參數值調用,則在同一會話期間並且在它們之間不發生刷新操作時,第二個調用應該會觸發緩存。這可以通過在mapper.namespace軟件包上啓用調試日誌來檢查。

緩存在ORM(Hibernate ..)中不起作用:由實體類型和主鍵引用的緩存。

緩存持續最多直到會話結束。

在會話期間重複請求相同的數據(相同的語句/參數)時很方便,不需要存儲結果供下次使用,只需再次調用語句,緩存將只保存對結果的訪問權限。

+0

謝謝,我還有一個問題,如果我執行選擇*從表中id = 1更新@select,結果將被保存在緩存中。我想知道是否我在同一個會話中執行了兩次相同的SQL,第二次會碰到緩存或訪問數據庫。如果第二次擊中緩存,則會出現錯誤。 –

+0

你是對的,我已經澄清了關於這一點的答案。 – blackwizard