最近做项目需要将通过API的到的数据存到本地,并且确保本地数据库中某张表的数据与数据源的数据保持一定的同步性,以下为解决问题的思路:
1.在本地做好映射确保可以从外部访问,让api的提供方在数据库提供一个触发器,当数据提供方的数据发生变化时,主动同步到本地。(对方拒绝,扑街)
2.用Mysql的repalce into 语句进行结合定时器来对数据的定时更新。
3.网上还有一种思路是,从本地数据库调用此表中不变的字段,从api调用改变的字段并保存到缓存以减少访问远端的次数以及减少数据量。但是本表是row整体变化所以不采用。
采用replace into附上自己在mybatis中的使用:
<insert id=“addSkuRelationByBatch" useGeneratedKeys="true" parameterType="java.util.List">
repalce into relation_detail
(
pcrProductSku,
pcrQuantity,
pcrPercent
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.pcr_product_sku,jdbcType=VARCHAR},
#{item.pcr_quantity,jdbcType=VARCHAR},
#{item.pcr_percent,jdbcType=VARCHAR}
)
</foreach>
</insert>
使用replace into 应该注意一下几点:
replace跟insert的功能类似,区别在于:
1.replace 在将数据插入表中之前先判断是否存在此条数据,如果存在先删除此条数据,不存在直接插入数据。(判断的条件是主键或者唯一索引,插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据)。
2.replace into中的into可以省略不写,但是个人习惯写明。
3.如果某列无值,mysql将插入默认的值