Skip to content

Releases: Tencent/APIJSON

【性能】大幅提升数组内主表查询性能

31 Jan 16:08
Compare
Choose a tag to compare

解决 bug

解决 "toId%": "0,10" 等连续范围报错 value 类型不合法;
解决 "id{}@": "[]/Moment/praiseUserIdList" 等引用赋值的值有时类型为 List 时报错 ArrayList cannot be cast to JSONArray;
解决 "key<>": "a" 这种包含字符串的格式报错 Data truncation: Invalid JSON text,原来必须里面再用 "" 包装一次,JSON 中还得转义,现在简化成直接写即可;

增强安全

对 MySQL 的 DELETE 和 UPDATE 强制加 LIMIT,限制一次操作记录的数量;

提升性能

通过缓存及复用数组主表 ObjectParser 来大幅提升大量数据的数组内主表的查询性能;
通过减少不必要的 newSQLConfig 及 getSQL 等步骤来大幅提升大量数据的数组内主表的查询性能;

对比 4.5.2 在 Log.DEBUG = true(开启日志)的情况下

TestRecord[] 耗时降低至原来 24%,性能提升 300% 至原来 4 倍;
Moment[] 耗时降低至原来 33%,性能提升 200% 至原来 3 倍;
朋友圈列表耗时降低至原来 77%,性能提升 23% 至原来 1.2 倍。
其中每个数组都按 100 条来测试,如果每页数量更大或每项数据量更大,则提升会更加明显。

腾讯 CSIG 某项目线上生产环境实测 Log.DEBUG = false 时 2.3KW 大表(由两张等量拆分表组成)查询

LIMIT 100 相比原来从 2s 降到 164ms 提升 11 倍;
LIMIT 1000 相比原来从 30s 降到 197ms 提升 151 倍;
LIMIT 10000(一次 /get 到 1W 条记录) 整个网络请求耗时仅 633ms;
LIMIT 1000000(带条件一次 /get 到 12W+ 条记录共 72.5M 数据,CURL 下载速度 20M/s) 整个网络请求仅 5.624s,实际服务执行仅 2s。

兼容性

这个版本重构了几个方法:

1.Parser.createObjectParser
Parser createObjectParser(JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception;

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

Parser createObjectParser(JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception;

2.AbstractParser.createObjectParser
AbstractObjectParser createObjectParser(JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

AbstractObjectParser createObjectParser(JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception

3.ObjectParser.parse
ObjectParser parse() throws Exception;

新增 2 个参数 String name, boolean isReuse 后为

ObjectParser parse(String name, boolean isReuse) throws Exception;

4.AbstractObjectParser.parse
AbstractObjectParser parse() throws Exception;

新增 2 个参数 String name, boolean isReuse 后为

AbstractObjectParser parse(String name, boolean isReuse) throws Exception;

5.AbstractObjectParser 的构造方法
public AbstractObjectParser(@NotNull JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

public AbstractObjectParser(@NotNull JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception

具体见

a406242

兼容 JDK 11+;优化性能和代码;完善文档等

24 Jan 15:26
893d3b3
Compare
Choose a tag to compare

APIJSONORM

新增 javax.activation 依赖来兼容 JDK 11+,感谢 知乎 sunxiaoguang 的贡献 PR#194
新增 APIJSON 接口调试实践 的链接,感谢腾讯同事贡献 Issue#189
解决异常情况下未及时释放资源,感谢 奇安信代码卫士 的贡献 Issue#182-185
解决某些情况下解析 引用赋值 出错,其它修复与优化,感谢  源伞科技 的贡献 Issue#48

优化全局默认参数的解析性能;

文档:

相关推荐新增 APIJSON 接口调试实践,感谢腾讯同事的贡献;
相关推荐新增用户发的博客 apijson简单使用,感谢 Grey Zeng;
贡献者们新增来自知乎的 sunxiaoguang,感谢贡献代码;

【安全】解决高并发时参数校验出错

16 Jan 17:56
Compare
Choose a tag to compare

解决高并发情况下参数校验规则可能因为执行过程 remove 了部分操作关键词导致校验出错甚至出现安全漏洞 - 该问题由 APIJSON 4.4.5 优化 增删改 性能时 引入

优化代码;更新文档;升级 fastjson;

13 Jan 02:17
05dc3eb
Compare
Choose a tag to compare

优化代码,感谢 github-ganyu 的贡献 #190
升级 fastjson 至 1.2.75,感谢 github-ganyu 的贡献 #190
更新文档,新增贡献者昵称和头像;

apijson-framework 4.3.3-4.5.0
https://github.com/APIJSON/apijson-framework/releases

APIJSON-Demo 4.2.0-4.5.0
https://github.com/APIJSON/APIJSON-Demo/releases

升级 APIJSONORM 版本为 4.4.8

28 Dec 15:28
297c251
Compare
Choose a tag to compare

注:只是为了解决 jitpack.io 打包后 maven 下载失败,实际上只是因为 maven 仓库同步延迟,之前打的 4.4.6 和 4.4.7 现在也能成功通过 maven 下载依赖包了

升级版本号至 4.4.7

26 Dec 18:03
5a51f88
Compare
Choose a tag to compare
Update pom.xml

解决校验参数的 bug

26 Dec 17:47
Compare
Choose a tag to compare

解决 REQUEST_MAP 缓存中的 strcuture 在校验参数抛异常后未被还原,导致后续解析丢了部分配置;
解决 REFUSE 值为 "!" 时因为没有匹配 MUST,而是匹配了 NECESSARY 导致判断出错;
升级版本号为 4.4.6;

【性能】大幅提升增删改的性能;增强对 SQL 数学表达式的支持

26 Dec 16:13
Compare
Choose a tag to compare

返回字段 @column 支持 (balance)*100 和 length(content)%2=0 这种 字段 或 SQL 函数 后拼接数字比较表达式;

解决 PUT 请求传 @key:[] 被当成表字段然后解析报错;
解决 关闭权限验证情况下批量新增、批量修改依然会验证权限;

@column@having 不允许注释符 /*;

通过缓存 Request 校验规则来大幅提升增删改等非开放请求的性能;

升级版本号至 4.4.5;
完善文档;

增强对聚合函数 @having 和 原始 SQL 片段 @raw 的支持;其它调整和优化;

13 Dec 18:13
Compare
Choose a tag to compare

原始 SQL 片段 @raw:"key" 新增支持条件范围 key{}: "(`Comment`.`userId`=`to`.`userId`)"、比较运算 key>: "to.momentId"、过滤字段 @column: "SUBSTRING_INDEX(SUBSTRING_INDEX(name,',',2),',',1)",聚合函数 @having:"to_days(now())-to_days(`date`)<=7" ;
@having@column 一样支持 function(arg,&char,!) 中包含不符合 字段命名 的字符;优化代码和报错提示;

解决 "isPraised-()": "isContain(praiseUserIdList,userId)" 这种有前置执行 远程函数 的表对象可能返回没有表数据的对象,只有 { "isPraised": true } 这种无意义的对象;

存储过程 @procedure():"fun(key0,key1..)" 返回格式中去掉 key 的 @ 前缀;
取消支持 key? 这种正则匹配方式,全面用 key~ 替代;
优化报错提示;
优化代码;
升级项目版本号;
更新文档;

【安全】增强对批量删改中 id{} 的校验

01 Dec 16:40
Compare
Choose a tag to compare

解决 Windows mysql-5.6.26-winx64 等低于 5.7 的 MySQL 可能 id{}: [0] 生成 id IN(0) 触发 MySQL bug 导致忽略 IN 条件;

注:
本 bug 由于隐式类型转换时把 字符串类型的非数字值 转为 0 导致,目前仅在数据库类型为 MySQL 且版本低于 5.7 时发现。
感谢开源作者群友 天津黑核科技-湖水没了(企业法人代表) 发现的风险
https://my.oschina.net/publiccms/blog/4769241