Releases: Tencent/APIJSON
达梦数据库; JOIN/Oracle bug; English doc
功能
新增支持国产达梦数据库 DM 7.6+,对应 Demo APIJSONBoot-MultiDataSource;
解决 JOIN 当主副表都有条件、子查询当内外查询都有条件时可能预编译值错位;
fix: 修复子查询与外查询参数顺序,感谢 @transtone 的贡献 #447;
fix: 解决数据源为Oracle时,@Explain 报错问题,感谢 @ifooling 的贡献 #434;
fix: 解决数据源为Oracle时,使用自增主键,获取不到插入的主键问题,感谢 @ifooling 的贡献 #434;
优化调试信息及日志打印,解决异常栈不够精准;
文档
完善 English README 和 Document;
新增登记 爱投斯智能技术(深圳)有限公司,感谢 @andy19055 的贡献 #452;
新增登记 上海信息出奇科技有限公司,感谢 @AwenJackson 的贡献 #450;
新增 晨讯科技web前端开发高级工程师的文章 APIJSON-零代码接口和文档 JSON 协议 与 ORM 库;
新增公众号“程序猿香蕉”的 3 篇文章,包括 APIJSON的那些事儿,感谢 @AwenJackson 的贡献 #443;
生态项目新增 SQLAuto-智能零代码自动化测试 SQL 语句执行结果的数据库工具,点 Star 支持作者吧~
其它
优化代码格式;
贡献者们
主项目 APIJSON 的贡献者们(6 个腾讯工程师、1 个微软工程师、1 个知乎基础研发架构师、1 个字节跳动工程师、1 个网易工程师、1 个 Zoom 工程师、1 个圆通工程师、1 个智联招聘工程师、1 个美国加州大学学生、3 个 SUSTech 学生等):
https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md
生态周边项目的作者们(2 个腾讯工程师、1 个 BAT 技术专家、1 个微软工程师、2 个字节跳动工程师、1 个神州数码工程师&Apache dubbo2js 作者 等):
https://github.com/search?o=desc&q=apijson&s=stars&type=Repositories
https://search.gitee.com/?skin=rec&type=repository&q=apijson&sort=stars_count
物联网数据库 TDengine; JOIN 性能提升
功能
新增支持物联网时序数据库 TDengine,对应 Demo APIJSONBoot-MultiDataSource;
新增对 Year, Month, DayOfWeek 的支持;
完善数据库版本判断,兼容 MySQL 8.0 以上和以下版本,适配正则匹配、窗口函数等;
解决 APP JOIN 一对多时子数组长度超过预设范围;
fix: sql join缓存丢失而出现1+N查询问题,感谢用户 架构 - Jar @github291406933 再次贡献 #417;
大幅提升 APP JOIN 一对多时子数组查询和缓存性能;
优化 Join.isOne2Many 判断性能;
优化一对多 APP JOIN 的缓存逻辑;
记录 SQL JOIN 副表的聚合函数结果和之前不一致问题;
文档
doc: 修改文档错别字'借口'为'接口' issue #420,感谢 @Finkyky 的贡献 #421;
修改 APIJSON初期构思及实现.pages 中的错别字;
用户:腾讯外有华为、华能、百度、快手、中兴、圆通、传音等;
其它
如果你 提 PR 登记了自己使用 APIJSON 的公司,可以加 企业用户支持群,作者亲自且优先答疑,
只有解答了这个群里的全部问题,才看情况解答其它群里的问题(其它群不保证解答、更不保证及时)。
如果你为 APIJSON 做出了以下任何一个贡献:
提交了 PR 且被合并、提交了优质 Issue、发表了优质文章、开发了可用的生态项目,
可以在群里发出贡献链接并附带说明,管理员将设置关注你一段时间,优先答疑解惑。
其它群一般解答顺序:贡献者 > 帮助他人的群友 > 带企业名昵称 > 带岗位名昵称 > 其他群友。
跨级 APP JOIN;腾讯业务百万数据 6s 响应
新增支持跨层级 APP JOIN,感谢 @github291406933 的贡献 #413 ;
新增对 LocalDateTime 类型支持,感谢 @MentosL 的贡献 #394 ;
还原依赖 javax.activation,实测 JDK 11, 13 都需要;
修复多字段参与 JOIN 时,没有命中缓存而出现的 1+N 查询性能问题,感谢 @github291406933 的贡献 #403 ;
完善对 APP JOIN 的 SQL 执行与缓存次数统计;
解决 @combine:"(a | b) & (c | d)" 这种任意条件组合情况下有时预编译值错位导致 SQL 报错;
解决 APP JOIN 副表返回内部字段 @RAW@LIST;
升级 fastjson 版本至 1.2.83;
相关推荐新增 腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事;
数量级 | 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% |
提升可扩展性;解决 bug;优化功能和代码;完善文档等
功能
请求参数校验:REFUSE 新增支持 !key 排除禁止字段,优化 MUST 和 REFUSE 处理性能;
部分常量改为可自定义静态变量;
解决 PUT 不能完整替代 json, jsonb 字段的数组值,感谢 @weiwei162 的贡献 #387;
解决 Oracle 分页获取时无法获取除第一页以外的数据,感谢 @SingleDogL 的贡献 #390;
解决高并发下生成主键冲突导致新增记录失败等;
解决关闭权限校验时 POST 请求传 userId 无效,加强对 POST 请求内字段格式的校验;
解决 format: true 在 Log.DEBUG 时也不返回 SQL、时间等调试信息;
解决 JOIN 副表返回空对象;
解决预估容量判断 NOT 条件用错逻辑 key;
优化 SQL 执行缓存;
优化角色权限、参数校验、远程函数的初始化;
优化登录报错和远程函数执行报错的提示;
优化主键泛型;
优化代码;
删除不再需要的依赖 javax.activation;
升级自身版本为 5.1.0;
文档
更新 @combine 条件组合说明为 5.0+ 的条件任意组合格式;
更新 5.0 新增的 @having&:"...", @having:{...} 两种用法;
完善 JOIN 的类型以及 join:{...} 这种可带 ON 及功能符的写法;
完善 JOIN ON 的各种关联方式、支持多字段关联、支持其它条件的说明;
相关推荐新增 apijson在同一个接口调用中 使用远程函数写入更新时间和创建时间,感谢博主,点赞、收藏支持下博主吧~
生态项目新增 路由插件 apijson-router,对外暴露类 RESTful 接口,内部转成 APIJSON 接口执行,点 Star 支持下作者吧~
兼容性
AbastractSQLConfig 中
原来的 IdCallback 加了泛型 <T extends Object>,并且 Object newId(RequestMethod method, String database, String schema, String table) 改为 T newId(RequestMethod method, String database, String schema, String datasource, String table);
原来的 Callback 加了泛型 <T extends Object>,并且 SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String table) 改为 SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String datasource, String table);
原来的 SimpleCallback 加了泛型 <T extends Object>;
如果业务后端项目直接调用或重写了相关方法,需要对应修改;
8df36e2
AbstractSQLExecutor 中
SQLExecutor.KEY_RAW_LIST 移到 AbstractSQLExecutor,如果业务后端项目直接引用了这个常量,需要对应修改;
原来的缓存读写方法 putCache, removeCache, getCache, getCacheItem 中最后参数 int type 都改为了 SQLConfig config,如果业务后端项目直接调用或重写了相关方法,需要对应修改;
8df36e2
Parser 中
用于接口限流的配置参数 DEFAULT_QUERY_COUNT, MAX_QUERY_PAGE, MAX_QUERY_COUNT, MAX_UPDATE_COUNT, MAX_SQL_COUNT, MAX_OBJECT_COUNT, MAX_ARRAY_COUNT, MAX_QUERY_DEPTH 全都移到 AbstractParser,如果业务后端项目直接引用了这些常量,需要对应修改;
8df36e2
pom.xml 中
移除了依赖 javax.activation
95432dd
如果用 JDK 11 +,可能编译不通过或运行报错,可以在自己项目 <dependencies></dependencies> 标签内加上:
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
增强各种功能;腾讯负责人公开称赞;登记万科发起的采筑电商
功能
条件组合新增支持任意逻辑表达式 @combine:"a | (b & !(c | d))";
JOIN ON 新增支持 {}, <>, $, ~, !, >, <, >=, <= 等多种关联方式;
& INNER JOIN 新增支持单独设置 JOIN 语句中的字段、条件、分组、聚合、排序等;
* CROSS JOIN 允许没有 JOIN ON 引用赋值关联条件;
模糊搜索 key$:value 新增支持 key 中定制占位符 %, _ 与 value 的拼接方式;
包含选项范围新增支持传路径,例如 key<>:{ path: "$", value:82001 };
聚合函数 @having 支持复杂条件组合,且新增 @having& 简化 AND 连接的写法;
对 @having:"表达式" 和 key{}:"表达式" 新增支持单引号、反引号、各种关键词等;
新增支持 @having:"match(arg0..)AGAINST(..)%2=1" 全文检索等函数后带数学表达式;
对 key{}:">0;length(key)<=5" 新增支持部分为 RAW SQL;
新增支持 NULL 值 @null:"tag";
新增支持类型转换 @cast:"date:DATE";
新增数组关键词 compat 解决对聚合函数字段通过 query:2 分页查总数返回值错误;
状态信息 msg 新增提问注意事项;
权限控制:分拆对角色的校验的代码为多个方法,方便灵活重写部分代码;
完善对 id, id{}, userId, userId{} 的条件强制前置 AND 处理;
预估容量新增对 HAVING 聚合函数的处理;
拼错单词 globle 纠正为 global;
去除不必要的 synchonized;
原来的 combine 重命名为 combineMap,combineExpression 重命名为 combine;
升级自身, fastjson 版本分别为 5.0.0, 1.2.79;
使用登记
新增 珠海采筑电子商务有限公司(房地产巨头万科发起),多个项目使用,感谢 @fanpocha 的登记 #367;
新增 乐拼用车 的 Logo,感谢 @VamChao 的登记 #187#issuecomment-1009633459;
文档
兼容性
AbastractSQLConfig 原来的 combine 重命名为 combineMap,combineExpression 重命名为 combine,如果业务后端项目直接调用或重写了相关方法,需要对应修改;
b248c69
拼错单词 globle 纠正为 global,涉及 Parser 及 AbstractParser 中 getGlobleXXX, setGlobleXXX 14 个方法,如果业务后端项目直接调用或重写了相关方法,需要对应修改;
d7c3115
聚合函数 "@having":"SQL表达式1;SQL表达式2" 默认由 AND 连接改为 OR 连接,改用 "@having&":"SQL表达式1;SQL表达式2" 实现 AND 连接,如果前端(客户端)已经在线上生产环境用了旧方式,后端可以修改 AbstractSQLConfig.IS_HAVING_DEFAULT_AND = true 来兼容
9776408
聚合函数 "@having":"toId>0" 这种不包含 SQL 函数的表达式,默认不再支持,可改为 "@having":"(toId)>0",如果前端(客户端)已经在线上生产环境用了旧方式,后端可以修改 AbstractSQLConfig.IS_HAVING_ALLOW_NOT_FUNCTION = true 来兼容
9776408
腾讯工程师公开称赞
腾讯 IEG 数据产品开发组负责人 xinlin:
”腾讯的 APIJSON 开源方案,它可以做到零代码生成接口和文档,并且整个生成过程是自动化。
当企业有元数据的时候,马上就可以获得接口“
引用来源:腾讯游戏业务竟然是这样利用低代码平台的 | ArchSummit 全球架构师峰会 2021(深圳)
腾讯科技 后台开发高级工程师 雷大锤:
“可以抽出时间来看apijson了,这个可以为T10做准备,也是业界很火的东西,可以提升个人影响力!”
引用来源:腾讯人工作日常—在沟通和扯皮中度过的一周
APIJSON - 零代码、全功能、强安全 ORM 库
腾讯开源前十、内外五个奖项,后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构
http://apijson.cn
新增支持 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 ;