Skip to content

ECNU/ecnu-openapi-sdk-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java-SDK

能力

  • 授权模式(token 管理)
    • client_credentials 模式
    • password 模式
    • authorization code 模式
  • 接口调用
    • GET
    • POST
    • PUT
    • DELETE
  • 数据同步(接口必须支持翻页)
    • 全量同步
      • 同步为 csv 格式
      • 同步为 xlsx 格式
      • 同步到数据库
      • 同步到模型
    • 增量同步(接口必须支持ts增量参数)
      • 同步为 csv 格式
      • 同步为 xlsx 格式
      • 同步到数据库
      • 同步到模型

依赖

  • jdk 1.8
  • hibernate 5.6.11
  • scribejava-apis 8.3.3
  • jackson 2.13.0
  • opencsv 5.6
  • easyexcel 2.2.6

相关资料

支持的数据库

理论上只要 hibernate支持的数据库驱动都可以支持,以下是测试的情况

如果hibernate无法直接支持,可以先同步到模型,然后自行处理数据入库的逻辑。

数据库 驱动 测试情况
MySQL com.mysql.cj.jdbc.Driver 测试通过
SQLite null 测试通过
PostgreSQL org.postgresql.Driver 测试通过
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver 测试通过
Oracle oracle.jdbc.driver.OrableDriver 测试通过

示例

<dependency>
    <groupId>io.github.ecnu</groupId>
    <artifactId>ecnu-openapi-sdk-java</artifactId>
    <version>2.2.0-RELEASE</version>
</dependency>

authorization code

Todo

client_credentials

接口调用

初始化 SDK 后直接调用接口即可,sdk 会自动接管 token 的有效期和续约管理。

import com.alibaba.fastjson.JSONObject;

OAuth2Config cf = OAuth2Config.builder()
        .clientId(ecnuConfig.getClientId())
        .clientSecret(ecnuConfig.getClientSecret())
        .build();
OAuth2Client client = OAuth2Client.getClient();
client.initOAuth2ClientCredentials(cf);

String url = "https://api.ecnu.edu.cn/api/v1/sync/fakewithts?ts=0&pageNum=1&pageSize=1";
// -------test callApi----------
List<JSONObject> response = client.callAPI(url, "GET", null, null, JSONObject.class);

更多用法详见以下示例代码,和示例代码中的相关注释

性能

性能与 ORM 的实现方式(特别是对 upsert 的实现方式),数据库的实现方式,以及网络环境有关,不一定适用于所有情况。

当同步到数据库时,SDK 会采用分批读取/写入的方式,以减少内存的占用。

当同步到模型时,则会将所有数据写入到一个数组中,可能会占用较大的内存。

以下是测试环境

同步程序运行环境

  • i5 cpu
  • 32G 内存
  • windows10 X64
  • WD 固态硬盘
  • dotnet 4.8

测试接口信息

  • /api/v1/sync/fake
  • 使用 pageSize=2000 仅限同步
  • 接口请求耗时约 0.1 - 0.2 秒
  • 接口数据示例
{
	"errCode": 0,
	"errMsg": "success",
	"requestId": "73a60094-c0f1-4daf-bc58-4626fbef7a2b",
	"data": {
		"pageSize": 2000,
		"pageNum": 1,
		"totalNum": 10000,
		"rows": [{
			"id": 1,
			"colString1": "Oxqmn5MWCt",
			"colString2": "mzavQncWeNlOlFgUW7HC",
			"colString3": "mvy6K1HU7rdCicPbvvA3rNZcDWPhvV",
			"colString4": "XGsK5NVQHOu4JrmHZ9ZL1iLf0UYpdIvNIzswULzb",
			"colInt1": 3931594532918648027,
			"colInt2": 337586114254574578,
			"colInt3": 2291922259603323213,
			"colInt4": 3000562485500051124,
			"colFloat1": 0.46541339000557547,
			"colFloat2": 0.6307996439929248,
			"colFloat3": 0.9278393850101392,
			"colFloat4": 0.7286866920659677,
			"colSqlTime1": "2023-10-20 22:02:07",
			"colSqlTime2": "2023-10-20 22:02:07",
			"colSqlTime3": "2023-10-20 22:02:07",
			"colSqlTime4": "2023-10-20 22:02:07"
		}]
	}
}

测试结果

  • 数据库:本地sqlite
  • pageSize = 2000
  • batchSize = 100
数量级 Model Time(s) Model Mem(MB) sqlite Time(s) sqlite Mem(MB)
1W 1.748 164 3.078 117
10W 13.129 426 20.144 167
100W 123.48 4791 156.255 168

Releases

No releases published

Packages

No packages published

Languages