目录
1.介绍
1、根据WebService接口,获取Json 数据,按周分表,存储数据。
2、存储海量数据,mysql 引擎使用表锁定,而不是行锁定,不支持事务,但查询速度极快,可组合不同的周表,进行合并。按条件查询总表,百万数据可在1秒内查询出结果。
3、展视使用Layui 动态数据表格,可通过复选框的勾选,动态的添加或减少表格列数,是动态的表头、展视动态的数据总量、动态的分页导航插件。
4、导出功能,前端通过ajax 请求,服务器进行批量缓存,生成excel 文件。成功后,前端获得 nginx 的下载地址,直接进行保存下载。
2.获取WebService接口数据
1)浏览器验证接口方法,访问:http://xxxx.asmx
2) idea 根据地址,生成webservice 接口代码
3)使用生成的工具类,可以删除 .calss 文件
首先创建工厂,再通过工厂创建soap,最后使用soap 中的接口方法,获取json 数据
Namefactory = new Name();
NameSoap soap = factory.getNameSoap();
String json = soap.getName('参数');
4) 取出 json数据的部分数据,如 result 结果,然后转换为User对象,存入 list<User> 集合,再调插入数据库方法
<!-- POM 文件依赖 Json Lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<!-- 指定jdk版本 -->
<classifier>jdk8</classifier>
</dependency>
List<User> list = new ArrayList<User>();
JSONObject jsonObject = JSONObject.fromObject(json);
JSONArray jsonArray = (JSONArray) jsonObject.get("result");
Iterator it = jsonArray.iterator();
while (it.hasNext()) {
JSONObject result = (JSONObject) it.next();
User user= (User)JSONObject.toBean(result, User.class);
list.add(User);
}
由于接口数据量巨,大约100M。3分钟获取接口数据,但 json-lib 解析 json 速度很慢,二十分钟未响应。换成了jackjson ,速度瞬间快起来了。
jackjson 的API文档:
https://www.cnblogs.com/better-farther-world2099/articles/14120287.html
ObjectMapper 序列化对象: 用于转换 javaBean 对象,转换JsonNode、ObjectNode 对象
JsonNode:只读节点树:用于读取 json 节点的数据
ObjectNode:只写节点数:用于插入,写入json 数据
String jsonStr = 接口获取的json String数据;
//1.创建jackjson 对象
ObjectMapper mapper = new ObjectMapper();
//2.解析String 对象为读树节点
JsonNode node = mapper.readTree(jsonStr);
//3.读取json 的result 节点,该节点的数据是循环的json集合
JsonNode resultNode = node.get("result");
//解放 node 对象,释放内存
node =null;
Iterator it = resultNode.iterator();
while (it.hasNext()) {
JsonNode result = (JsonNode) it.next();
//可循环操作,单个节点数据,如获得节点中的name 值
String name = result.get("name").asText();
//将单个节点数据 转换为 javabean对象
User user= mapper.convertValue(result, User.class);
}
3.mysql 数据库使用分表MYISAM引擎
1)创建分表,例如:t_user_01、t_user_02
NOT NULL 非空、COMMENT 备注
PRIMARY KEY 主键、INDEX索引
ENGINE=MYISAM 表锁定引擎、CHARSET=utf8 字符格式
@Insert(
"CREATE TABLE `t_user_${tableName}` (" +
"`id` int(11) NOT NULL COMMENT 'id',"+
"`create_date` datetime DEFAULT NULL COMMENT '创建时间'," +
"`name` varchar(255) NOT NULL COMMENT '名称',"+
"`type` int(5) NOT NULL COMMENT '类别'," +
" PRIMARY KEY (`id`),INDEX(`name`)"+
") ENGINE=MYISAM CHARSET=utf8;")
void createTable(@Param("tableName")String tableName);
2)往分表里,批量插入数据
将User 数据,存在list 集合,循环插入mysql,执行方法每8000条循环一次,效率高
@Insert({"<script>"+
"insert into `t_user_${tabelName}`" +
"(id , create_date , name , type)" +
"values " +
"<foreach collection='list' item='item' index='index' separator=','>"+
"(UUID() , NOW() , #{item.name} , #{item.type}" +
"</foreach>" +
"</script>"})
public void addLabelView(@Param(value="list") List<User> list,String tabelName);
3)sql 创建总表,例如:t_user_all
ENGINE=MRG_MYISAM 总表引擎
UNION =(t_user_01,t_user_02) 关联分表的数据给总表,不额外创建数据,效率高
INSERT_METHOD=NO 不许插入,插入方式有:NO 、LAST、FIRST
@Insert("<script>"+
"CREATE TABLE `t_user_all_${tableName}` (" +
"`id` int(11) NOT NULL COMMENT 'id',"+
"`create_date` datetime DEFAULT NULL COMMENT '创建时间'," +
"`name` varchar(50) NOT NULL COMMENT '名称',"+
"`type` int(5) NOT NULL COMMENT '类别'," +
" PRIMARY KEY (`id`),INDEX(`name`)"+
") ENGINE=MRG_MYISAM INSERT_METHOD=NO UNION =" +
"<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>" +
"t_user_${item}"+
"</foreach>" +
"CHARSET=utf8;"+
"</script>")
void createTableAll(@Param(value="list") List list,@Param("tableName") String tableName);
4)查询总表
注意搜索条件,传入User 的 typeList对象 需要是Intger类型,如:List<Intger>
不然mysql 查询的是IN ('1','2')而不是IN(1,2ÿ