由于公司系统属性原因,需要实时接入客户秒级数据,在数据量到达亿级时,发现性能远不如从前,系统不稳定性与日俱增,网站访问速度越来越慢,虽然已经使用了redis缓存来解决读写压力,仍然达到最优效果,因此目前将决定数据库分表,以实现对数据库的优化。由于业务属性原因,我们将主表按照货币进行分表。
1、调用接口
if(!CollectionUtils.isEmpty(dataList)) {
int result = mainDailyMapper.batchInsert(dataList,dataList.get(0).getSymbol().toLowerCase());
//添加入数据库
logger.info("{} records inserted to DB, RIC= {}", result, RIC);
}
2、接口实现
int batchInsert(@Param("list")List<MainDaily> list,@Param("currency")String currency);
使用@param注解进行传值。
3、mapper.xml文件配置:
<insert id="batchInsert" parameterType="map">
insert into main_daily_${currency} (QUOTEID, SYMBOL, QUOTIM,
QUOTE_DATE)
values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.quoteid},
#{item.symbol},
#{item.quotim},
#{item.quoteDate}
)
</foreach>
</insert>
注意:由于使用#{}会产生单引号破坏sql,因此table名用${},<foreach>中的collection的值与接口实现中@param中的value绑定,如@param("list"),那么collection=“list”,另外parameterType用map。
数据库分表基本实现。