公司须要作随机抽奖活动(非大转盘,直接抽取列表),采用两种方案: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",则当你更新后,查询的数据数据仍是老的数据。