Инкапсуляция результатов JDBC

1

У меня очень распространенная проблема инкапсуляции. Я запрашиваю таблицу через jdbc и должен хранить записи в памяти на некоторое время для обработки. У меня нет hibernate POJO для одной и той же таблицы для создания любых объектов и сохранения. Я говорю о загрузке, скажем, 200 миллионов в одном запрос.

Общий подход заключается в создании массива объектов и выполнении кастинга, когда мне нужно их использовать. (Предположим, я могу получить данные таблицы, такие как имя столбца и тип данных, которые будут сохранены в некоторых справочных таблицах..) Но этот подход будет очень дорогим (время), я думаю, когда учитывается загрузка.

Любой хороший подход будет оценен...

  • 0
    Мое беспокойство вовремя занято для обработки. Предположим, у меня достаточно памяти в системе ...
  • 0
    Вам понадобится много памяти, чтобы иметь возможность хранить 200 миллионов строк в памяти.
Показать ещё 2 комментария
Теги:
arrays
jdbc
resultset
encapsulation

3 ответа

1

Похоже, что CachedRowSet сделал бы трюк здесь. Это в значительной степени то, что вы хотите. Это займет ResultSet и сосать все это, тогда вы можете работать над ним на досуге.

Дополнения:

Я действительно ищу надежного владельца записи с легким доступом к членам

Но это в точности то, что такое CachedRowSet.

Он управляет коллекцией записей с именованными (и пронумерованными) столбцами и предоставляет типизированный доступ к этим столбцам.

CachedRowSet crs = getACachedRowSet();
crs.absolute(5) // go to 5th row, shows you have random access to the contents.
String name = crs.getString("Name");
int age = crs.getInt("Age");
date dob = crs.getDate("DateOfBirth");

Хотя я уверен, что вы можете что-то сделать самостоятельно, CachedRowSet дает вам все, о чем вы просили. Если вы не хотите загружать данные в оперативную память, вы можете просто использовать ResultSet.

Только нижняя сторона заключается в том, что он не является потокобезопасным, поэтому вам нужно синхронизировать его. Но эта жизнь. Как именно CachedRowSet не отвечает вашим потребностям?

  • 0
    Спасибо за ваши комментарии .. Но я боюсь, что это не поможет мне. Позвольте мне пояснить это на примере. Предположим, что в таблице есть столбцы Имя, Возраст и Дата рождения. Теперь в наборе результатов есть три строки. Я не хочу кешировать это, так как моя обработка может быть многопоточной, и даже я могу запускать несколько запросов. Как я буду хранить эти три столбца в памяти и использовать их при необходимости без осложнений. Массив объектов был одним из решений, но проблема заключается в приведении типов. Я действительно ищу надежного рекордсмена с легким доступом к участникам
  • 0
    Если бы я мог компилировать и поддерживать класс на лету и работать над ним (создавать массивы этого объекта класса), это решило бы проблему. Но для этого я должен попробовать рефлексию и все, что будет накладными расходами. Я просто хотел узнать, есть ли другой лучший способ.
Показать ещё 3 комментария
0

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

В этом случае я бы подумал, что единственный реальный способ сделать это - превратить каждую строку в строку с разделителями (CSV, XML или что-то еще), а затем создать массив строк.

Вы можете получить список имен столбцов, возвращаемых запросом JDBC, как в этом ответе:

Получить имена столбцов из java.sql.ResultSet

  • 0
    Спасибо за ответ. Но, опять же, это займет много времени. Как я упоминал ранее, я буду выполнять обработку с этими записями. В этом случае, скажем, если я сохраняю это как строку с разделителями, то каждый раз Я должен разобрать строку, чтобы получить отдельные столбцы. Затем я снова должен привести строку к требуемым типам данных, что более или менее аналогично хранению данных в массиве объектов ... Имеет ли это смысл ??
  • 0
    Возможно, на это нужно смотреть с другой стороны. Какой вид обработки вам нужно сделать?
Показать ещё 1 комментарий
0

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

 ResultSet rs = stmt.executeQuery();
 while (rs.next()) {
    String col1= rs.getString("col1");
    Integer col2= rs.getInt("col2");
    MyClass o = new MyClass(col1,col2);
    add(o);
 }
 rs.close();
  • 0
    Нет, приятель, я не могу этого сделать. Я не могу создать класс (MYClass в вашем примере) и развернуть его. Я уже упоминал, что я не создал POJO для соответствующей таблицы.
  • 0
    Чтобы было понятнее, соответствующая таблица полностью настраивается. Вот почему я не могу создать классы POJO до этой задачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню