Нужен более эффективный способ преобразования набора результатов JDBC в массив JSON - PullRequest
0 голосов
/ 26 июня 2019

В настоящее время у меня есть следующий код, который преобразует мой набор результатов в JSONObject и затем добавляется в JSONArry, но время обработки слишком велико для больших наборов данных. Я ищу альтернативный способ или библиотеки для улучшения моего текущего компьютерного времени.

В настоящее время для обработки 14 тыс. Записей из базы данных Oracle требуется от 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);

            }

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Если вы используете Oracle 12cR2, вы можете использовать функции, предоставляемые Oracle (JSON_OBJECT, JSON_ARRAY, JSON_OBJECTAGG и т. Д.), Чтобы генерировать JSON непосредственно из базы данных, готовой к чтению. Это будет значительно быстрее и проще для кодирования.

Вы не опубликовали дополнительную информацию о своей модели данных, чтобы мы могли помочь с чем-то более конкретным, но не стесняйтесь изучать приведенную ниже документацию.

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"}
1 голос
/ 26 июня 2019

Я бы сделал следующий тест: F: = время, необходимое для извлечения из базы данных;J: = время, необходимое для сериализации JSON из предварительно выбранных.Я подозреваю, что ваш F >> J, который указывает, что вам нужна не другая библиотека JSON, а более быстрое чтение из базы данных.Это может или не может быть растворимым.Однако, если F << J, рассмотрите возможность распараллеливания вашей сериализации, чтобы воспользоваться дополнительными ядрами, если они доступны. </p>

...