У меня очень распространенная проблема инкапсуляции. Я запрашиваю таблицу через jdbc и должен хранить записи в памяти на некоторое время для обработки. У меня нет hibernate POJO для одной и той же таблицы для создания любых объектов и сохранения. Я говорю о загрузке, скажем, 200 миллионов в одном запрос.
Общий подход заключается в создании массива объектов и выполнении кастинга, когда мне нужно их использовать. (Предположим, я могу получить данные таблицы, такие как имя столбца и тип данных, которые будут сохранены в некоторых справочных таблицах..) Но этот подход будет очень дорогим (время), я думаю, когда учитывается загрузка.
Любой хороший подход будет оценен...
Похоже, что 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 не отвечает вашим потребностям?
Чтобы сделать его более понятным, задействованная таблица полностью настраивается. Вот почему я не могу создавать классы POJO до этой задачи.
В этом случае я бы подумал, что единственный реальный способ сделать это - превратить каждую строку в строку с разделителями (CSV, XML или что-то еще), а затем создать массив строк.
Вы можете получить список имен столбцов, возвращаемых запросом JDBC, как в этом ответе:
Ну, если вам нужны 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();