隨機抽獎活動中的MyBatis的flushCache和useCache的使用

公司須要作隨機抽獎活動(非大轉盤,直接抽取列表),採用兩種方案:java

1:mysql randmysql

select
    id, userid, license_no, engine_no, car_type, syr, sfzmhm, hphm, phone
    from cor_reward_resource
    ORDER BY RAND()
    LIMIT #{rewardLength}sql

2:java for 循環緩存

SELECT t1.id, t1.userid, t1.license_no, t1.engine_no, t1.car_type,
    t1.syr, t1.sfzmhm, t1.hphm, t1.phone
    FROM `cor_reward_resource` AS t1
    JOIN (
    SELECT ROUND(RAND() * ((
    SELECT MAX(id)
    FROM
    `cor_reward_resource`)-(
    SELECT MIN(id)
    FROM `cor_reward_resource`))+(
    SELECT MIN(id)
    FROM `cor_reward_resource`)) AS id
    ) AS t2
    WHERE t1.id >=
    t2.id
    ORDER BY t1.id
    LIMIT 1mybatis

第二種方法循環查詢出的對象徹底同樣,解決方案以下.net

2.1:添加隨機參數,保證sql不同,避免緩存對象

SELECT t1.id, t1.userid, t1.license_no, t1.engine_no, t1.car_type,
    t1.syr, t1.sfzmhm, t1.hphm, t1.phone
    FROM `cor_reward_resource` AS t1
    JOIN (
    SELECT ROUND(RAND() * ((
    SELECT MAX(id)
    FROM
    `cor_reward_resource`)-(
    SELECT MIN(id)
    FROM `cor_reward_resource`))+(
    SELECT MIN(id)
    FROM `cor_reward_resource`)) AS id
    ) AS t2
    WHERE t1.id >=
    t2.id
    and #{cacheLoseEfficacyFlag} > -1
    ORDER BY t1.id
    LIMIT 1blog

2.2:mybatis 配置刷新不適用cacheget

<select id="selectOne" resultMap="BaseResultMap" flushCache="true" useCache="false" >配置

    SELECT t1.id, t1.userid, t1.license_no, t1.engine_no, t1.car_type,
    t1.syr, t1.sfzmhm, t1.hphm, t1.phone
    FROM `cor_reward_resource` AS t1
    JOIN (
    SELECT ROUND(RAND() * ((
    SELECT MAX(id)
    FROM
    `cor_reward_resource`)-(
    SELECT MIN(id)
    FROM `cor_reward_resource`))+(
    SELECT MIN(id)
    FROM `cor_reward_resource`)) AS id
    ) AS t2
    WHERE t1.id >=
    t2.id
    ORDER BY t1.id
    LIMIT 1
  </select>

 

 

ps:MyBatis的flushCache和useCache的使用

(1)當爲select語句時:

flushCache默認爲false,表示任什麼時候候語句被調用,都不會去清空本地緩存和二級緩存。

useCache默認爲true,表示會將本條語句的結果進行二級緩存。

(2)當爲insert、update、delete語句時:

flushCache默認爲true,表示任什麼時候候語句被調用,都會致使本地緩存和二級緩存被清空。

 

useCache屬性在該狀況下沒有。

當爲select語句的時候,若是沒有去配置flushCache、useCache,那麼默認是啓用緩存的,因此,若是有必要,那麼就須要人工修改配置,修改結果相似下面:

  <select id="save" parameterType="XX" flushCache="true" useCache="false">  </select>  

update 的時候若是 flushCache="false",則當你更新後,查詢的數據數據仍是老的數據。

相關文章
相關標籤/搜索