需要一种更有效的方法将 JDBC 结果集转换为 JSON 数组
Need a more efficient way to convert JDBC resultset to a JSON array
目前我有以下代码将我的结果集转换为 JSONObject,然后附加到 JSONArry,但处理时间对于大型数据集来说太长了。我正在寻找替代方法或库来改善我当前的计算时间。
目前从 Oracle DB 处理 14k 条记录需要 16 到 17 秒
int total_rows = rs.getMetaData().getColumnCount();
while (rs.next()) {
JSONObject obj = new JSONObject();
for (int i = 0; i < total_rows; i++) {
obj.put(rs.getMetaData().getColumnLabel(i + 1)
.toLowerCase(), rs.getObject(i + 1));
}
jsonArray.put(obj);
}
我会做以下测试:F := 从数据库中获取数据所花费的时间; J := 从 pre-fetched 序列化 JSON 所花费的时间。我怀疑你的 F >> J,这表明你需要的不是不同的 JSON 库,而是更快地从数据库读取。这可能会或可能不会溶解。但是,如果 F << J,请考虑并行化序列化以利用可用的额外内核。
如果您使用的是 Oracle 12cR2,您可以利用 Oracle 提供的函数(JSON_OBJECT、JSON_ARRAY、JSON_OBJECTAGG 等)直接从数据库,准备读取。它的编码速度会大大加快,也更容易。
您尚未发布有关您的数据模型的其他详细信息,因此我们可以提供更具体的帮助,但请随时浏览下面的文档。
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/generation.html
我在下面创建了一个简单的例子来展示它是如何工作的:
FSITJA@db01 2019-06-26 14:15:02> select json_object('name' value username,
2 'default_ts' value default_tablespace,
3 'temp_ts' value temporary_tablespace,
4 'common' value case when common = 'Y' then 'YES' else 'NO' end,
5 'oracle_maint' value case when oracle_maintained = 'Y' then 'YES' else 'NO' end
6 format json) as json_obj
7 from dba_users u
8 where oracle_maintained = 'Y'
9 and rownum <= 5;
JSON_OBJ
-----------------------------------------------------------------------------------------------------------
{"name":"SYS","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"SYSTEM","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"GSMCATUSER","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"XS$NULL","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"MDDATA","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
目前我有以下代码将我的结果集转换为 JSONObject,然后附加到 JSONArry,但处理时间对于大型数据集来说太长了。我正在寻找替代方法或库来改善我当前的计算时间。
目前从 Oracle DB 处理 14k 条记录需要 16 到 17 秒
int total_rows = rs.getMetaData().getColumnCount();
while (rs.next()) {
JSONObject obj = new JSONObject();
for (int i = 0; i < total_rows; i++) {
obj.put(rs.getMetaData().getColumnLabel(i + 1)
.toLowerCase(), rs.getObject(i + 1));
}
jsonArray.put(obj);
}
我会做以下测试:F := 从数据库中获取数据所花费的时间; J := 从 pre-fetched 序列化 JSON 所花费的时间。我怀疑你的 F >> J,这表明你需要的不是不同的 JSON 库,而是更快地从数据库读取。这可能会或可能不会溶解。但是,如果 F << J,请考虑并行化序列化以利用可用的额外内核。
如果您使用的是 Oracle 12cR2,您可以利用 Oracle 提供的函数(JSON_OBJECT、JSON_ARRAY、JSON_OBJECTAGG 等)直接从数据库,准备读取。它的编码速度会大大加快,也更容易。
您尚未发布有关您的数据模型的其他详细信息,因此我们可以提供更具体的帮助,但请随时浏览下面的文档。
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/generation.html
我在下面创建了一个简单的例子来展示它是如何工作的:
FSITJA@db01 2019-06-26 14:15:02> select json_object('name' value username,
2 'default_ts' value default_tablespace,
3 'temp_ts' value temporary_tablespace,
4 'common' value case when common = 'Y' then 'YES' else 'NO' end,
5 'oracle_maint' value case when oracle_maintained = 'Y' then 'YES' else 'NO' end
6 format json) as json_obj
7 from dba_users u
8 where oracle_maintained = 'Y'
9 and rownum <= 5;
JSON_OBJ
-----------------------------------------------------------------------------------------------------------
{"name":"SYS","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"SYSTEM","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"GSMCATUSER","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"XS$NULL","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}
{"name":"MDDATA","default_ts":"SYSTEM","temp_ts":"TEMP","common":"NO","oracle_maint":"YES"}