公司須要作隨機抽獎活動(非大轉盤,直接抽取列表),採用兩種方案: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",則當你更新後,查詢的數據數據仍是老的數據。