Releases: Tencent/APIJSON
新增支持 Hive 及 Hadoop;提升单表和 JOIN 结果集解析性能
新增支持 Hive 及 Hadoop,感谢 @chenyanlann 的贡献 #353 #356 以及生态项目 APIJSONBoot_Hive,大家可以点 Star 支持下~
调试时间字段新增 parse 和 sql 两个时长,例如 "time:start|duration|end|parse|sql": "1641751048573|145|1641751048718|50|95";
提升 JOIN 结果集解析性能,减少 ArrayList 反复扩容的性能开销;
新增登记 腾讯音乐、传音、社宝科技、华能贵诚信托、投投科技、圆通、乐拼科技 等公司名及链接。
新增自助调试说明;解决 JOIN bug 并显著提升性能
功能特性
报错信息新增搜索链接及带环境信息的提交问题模板,帮助用户自行解决及提交问题;
解决 LEFT/RIGHT JOIN 副表关联主表外键的字段取别名导致 SQL 报错 #346;
解决 SQL JOIN 副表包含 SQL 函数时没有返回 SQL 函数的执行结果以及未用上 SQL 缓存导致冗余 SQL 查询 #341;
解决 SQL JOIN 副表除了引用赋值键值对还有 id/id{}/userId/userId{} 键值对时不能命中缓存,导致 一对多、多对多副表数据重复 以及 一对一、多对一 查询性能问题 #341;
解决某个字段值为 null 导致中断后续正常返回值;
解决 AbstractVerifier.verifyAccess 只允许 Number 类型的 id,并优化变量名;
优化 SQL JOIN 副表解析结果集 ResultSet 的性能(减少同副表字段的重复逻辑),实测提升 6%-21% #354;
删除多余且未实际用上的的 Response.java;
周边生态
新增基于 Hyperf&Swoole 的 PHP 协程版 APIJSON 叫 hyperf-APIJSON,感谢 @kvnZero 的贡献;
新增接入 IBM DB2 的 Demo 叫 apijson-db2,感谢 @andream7 的贡献;
新增接入 ClickHouse Demo 叫 APIJSONDemo,感谢 @qiujunlin 的贡献;
新增使用 Gradle 依赖构建的 APIJSON Java 模版 apijson_template,感谢 @abliger 的贡献;
新增适配 Oracle 事务的 api-json-demo,感谢 @hxdwd 的贡献;
创作不易,右上角点 ⭐Star 支持下项目作者们吧~
相关推荐
新增文章 使用APIJSON写低代码Crud接口,感谢博主的贡献;
新增 7 篇代码分析相关系列文章,基本都是 27 篇中的开篇,感谢 3 个博主的贡献:
APIJSON(一:综述)
APIJSON 代码分析(三:demo主体代码)
APIJSON 代码分析(二)AbstractParser类(解析器)
APIJSON 代码分析(四:AbstractObjectParser源码阅读)
APIJSON 代码分析 AbstractSQLConfig 第二篇
APIJSON 代码分析(六)APIJSON—Verifier检查类
APIJSON 代码分析(四)AbstractSQLExecutor—SQL执行器
可以点赞/收藏支持下文章博主们哦~
其它
完善图文教程、路线规划等;
新增支持 ClickHouse、窗口函数 OVER、反引号 `key`、单引号 'value';大幅提升单表数组查询性能
新增支持 ClickHouse,感谢 @chenyanlann、@qiujunlin 的贡献 #307 #309;
新增支持 PostgreSQL, Oracle 等数据库的窗口函数 OVER(PARTITION BY .. ORDER BY ..),感谢 @qiujunlin 的贡献 #305;
重构 enum RequestRole 为 String 方便用户自定义扩展;
新增对 PUT 默认支持条件,不传 @combine 也行,感谢 @chenyanlann 的贡献 #307;
修改 @column 中的解析代码,使之支持带 SQL 关键词、单引号 'value' 等字符串,感谢 @qiujunlin 的贡献 #305;
新增支持 @column:"`key`" 反引号指定字段名以及 @column:"cast(`date` AS TIME)" 这种在函数内 `key` 与关键词等组合的格式;
新增支持 CASE WHEN,例如 (CASE sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '其它' END);
解决表对象中的子表对象数据总是一样以及在 Table[]:{ Table:{ ChildTable:{} } } 情况下只有首个 Table 里返回了 ChildTable;
解决聚合与分组等统计语句不支持 HAVING 等,感谢 @LiXinnnnnn 的贡献 #311;
解决 PUT "balance+": 1 未加到 update set 导致报错;
解决 PUT "key<>":[] 等被错误地转成了 SQL 条件 key = '[]' 等,感谢 @chenyanlann 的贡献 #307;
解决 PUT Table[] 请求中在某些情况下传远程函数无效的 bug,感谢 @WaizLee 的贡献 #324;
解决对 Oracle 的子查询 SELECT 语法错误的问题,感谢 @qiujunlin 的贡献 #309;
解决对 PostgreSQL 重复设置事务等级的 bug,感谢 @bullhe4d 的贡献 #316;
优化 Table[]:{ Table:{} } 这种单表数组的查询性能,实测提升 19%-27% #315;
将隐藏字段功能单独抽取方法 isHideColumn,方便重写来自定义;
抽取根据 tag 自动包装请求结构的方法为 wrapRequest,方便实现 简单形式的接口;
AbstractSQLConfig 中 getValue 和 preparedValueList 修饰符改为 protected 方便子类重写来实现兼容 Oracle DATETIME,TIMESTAMP 等日期时间类型,例如对应 POST/PUT 的 to_date(?,'yyyy-mm-dd hh24:mi:ss');
Parser 移除未用上且没必要的方法 parseCorrectResponse;
删除部分已废弃的方法;
通用文档 新增本身说明、3.2 功能符 全局关键词和"@Datasource":"DRUID" 跨数据源、3.1 操作方法 简单接口相关文档;
Pull Request 新增小改文档或代码 的简要步骤;
更新 详细的说明文档.md,修复一些错误或过时的内容;
完善 保持与 APIJSON 仓库的同步 的可视化操作步骤;
解决中英文首页文档部分用户 Logo 不显示,感谢 @sy-records 的贡献 #325;
生态周边项目新增 apijson-practice,感谢 BAT 技术专家 vcoolwind 的贡献;
增加一个示例项目和一篇文章,感谢 @jerrylususu 的贡献 #291;
新增 apijson-go 的链接,感谢作者 @j2go 的贡献 #apijson-go;
新增包括 1 个腾讯工程师在内的 8 个贡献者,感谢大家的贡献;
主项目贡献者新增 1 人,生态项目贡献者新增 7 人,感谢大家的贡献;
使用登记新增圆通公司(场景:大数据应用APP内部接口);
兼容性:
重构 enum RequestRole 为 String 方便用户自定义扩展,
移除了原有的 apijson.RequestRole.java,
改为了现在的 apijson.orm.AbstractVerifier 中的 String 常量
/**未登录,不明身份的用户
*/
public static final String UNKNOWN = "UNKNOWN";
/**已登录的用户
*/
public static final String LOGIN = "LOGIN";
/**联系人,必须已登录
*/
public static final String CONTACT = "CONTACT";
/**圈子成员(CONTACT + OWNER),必须已登录
*/
public static final String CIRCLE = "CIRCLE";
/**拥有者,必须已登录
*/
public static final String OWNER = "OWNER";
/**管理员,必须已登录
*/
public static final String ADMIN = "ADMIN";
如果你的业务项目中用到了 RequestRole 相关代码,则:
1.所有 apijson.RequestRole.角色名 全局替换为 apijson.orm.AbstractVerifier.角色名;
2.所有类型为 RequestRole 的地方全局替换为 String;
3.所有 role == RequestRole.角色名 全局替换为 AbstractVerifier.角色名.equals(role);
腾讯 CSIG 某项目性能测试结果
MySQL 5.7 共 1.9KW 记录的大表,统计 CRUL 10-20M/s 网速从发起请求到接收完回包的总时长,具体见 #315 (comment)
数量级 | 4.7.0(5次取平均值) | 4.8.0(5次取平均值) | 是否正常回包 | where条件 | 性能提升 |
---|---|---|---|---|---|
10W | 1.739s | 1.159s | 是 | 无 | 50%。即((1/1.159-1/1.739)/(1/1.739))*100% |
20W | 3.518s | 2.676s | 是 | 无 | 31.5% |
50W | 9.257s | 6.952s | 是 | 无 | 33.2% |
80W | 16.236s | 10.697s | -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok。 | 无 | 51.8% |
100W | 19.748s | 14.466s | -Xmx=3192M时无法正常回包,OOM错误,调大-Xmx参数后ok | 无 | 36.5% |
10W | 1.928s | 1.392s | 是 | "x_xid{}":[xxxx36,xxxx38],覆盖数据超过100W数据。 | 38.5% |
20W | 4.149s | 2.852s | 是 | "x_xid{}":[xxxx36,xxxx38] | 45.5% |
50W | 10.652s | 7.231s | 是 | "x_xid{}":[xxxx36,xxxx38] | 47.3% |
80W | 16.975s | 12.465s | 调整了-Xmx后正常回包 | "x_xid{}":[xxxx36,xxxx38] | 36.2% |
100W | 20.632s | 16.481s | 调整了-Xmx后正常回包 | "x_xid{}":[xxxx36,xxxx38] | 25.2% |
解决远程函数拿不到当前对象;解决 UNIQUE 防重校验失效
解决 @raw 对应值包含 date_format 等特殊文本时查询报错
解决 @raw 对应值包含 date_format 等特殊文本时查询报错,感谢圆通工程师反馈 bug 及贡献源码 #278 ;
新增数据源关键词;解决 Oracle 低版本兼容问题;优化 JOIN 和 分页 等
新增数据源关键词 @Datasource,可由业务完全自定义,感谢腾讯同事 fineday009 #251 ;
去除 JSONResponse 中 KEY_CODE 等常量的 final 关键字,方便业务重新定义 ok、code、msg 字段名,感谢 gujiachun #227 ;
解决 > RIGHT JOIN, ^ SIDE JOIN, ! ANTI JOIN, ) FOREIGN JOIN 等不返回副表数据;
解决 | FULL JOIN 返回的副表数据部分是错的;
分页:解决 query=2 不兼容 主表 @column:"fun()" 这种包含 SQL 函数的写法;
SQL 函数:获取右括号 ) 的位置从 indexOf 改为 lastIndexOf,解决多个右括号解析问题;
解决 JOIN 副表有 引用赋值 外的条件时因为缓存 SQL WHERE 中条件顺序不一致导致多余查询;
解决查询计划 @Explain 不支持增删改方法;在分页详情 info 内返回查询计划 @Explain;
更新为最新的手机号正则表达式匹配,感谢 Rkyzzy #241 ;
log print current time, thanks to Tencent colleague jun0315 #250 ;
优化 system.err.printlin 输出,感谢 kxlv2000 #238 ;
对 JSONResponse.java中 的 formatHyphen 方法的优化,感谢 403f #217 ;
使用 entrySet 迭代器替代 keySet 迭代器提高效率,感谢 Rkyzzy #224 ;
Using Arrays.toString() to deal with methods array, thanks to gdjs2 #221 ;
将 StringUtil.java 类中三处字符串直接拼接优化为使用 StringBuilder 拼接,感谢 Rkyzzy #222 ;
Format the code & Replace the Long(String) by Long.valueOf(String), thanks to gdjs2 #225 ;
Update README-English.md, thanks to Tencent colleague Wscats #235 ;
修改 Document 文档 OUTER JOIN 拼写错误,感谢腾讯同事 caohao-php #233 ;
优化状态信息和日志打印
SQL 函数白名单新增 length;key$ 模糊搜索不允许连续的 %
SQL 函数白名单新增 length;
key$ 模糊搜索不允许连续的 %;
AbstractSQLExecutor 新增 getKey 方法;
新增待实现关键词 @null;
删除 Structure.java, Operation 中 NECESSARY, DISALLOW 等已废弃的部分代码;
【安全】加强对 JOIN 和 SQL 函数的防护
调用 SQL 函数只允许用后端已配置的,避免 sleep(10) 这种命令函数导致数据库异常或耗时很久;
加强对 JOIN 相关键值对的校验,避免通过特殊符号进行 SQL 注入;
加强对命名的校验,避免用纯数字等非字母开头的表名/字段名导致 SQLException;
新增 整合 APIJSON 和微服务框架 light-4j 的 Demo(同时接入了 Redis);
新增用户发的文章 全国行政区划数据抓取与处理;
删除已废弃的 Test 类的相关代码;
解决对 Response 校验只对最外层生效;移除已废弃的 Test 类
解决对 Response 校验只对最外层生效;
移除已废弃的 StructureUtil 和 Test 的相关代码;