需要一种更有效的方法将 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"}