我有一个非常常见的封装问题。我正在通过jdbc查询表,并且需要在内存中保留记录一段时间以进行处理。我没有为同一个表提供任何hibernate POJO来创建任何对象和保存。我说的是一个查询中的负载,比如说2亿。
常见的方法是创建一个对象数组,并在需要使用它们时进行强制转换。(假设我可以获得表的详细信息,如列名和数据类型,这些信息将保存在一些参考表中。)但考虑到负载,我猜这种方法将非常昂贵(时间)。
任何好的方法都会受到赞赏。
发布于 2014-07-03 21:13:13
听起来像是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到底是如何不能满足您的需求的?
发布于 2014-07-03 20:52:43
如果你在内存中需要200m的对象,那么你可以在迭代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();发布于 2014-07-03 21:06:55
更清楚地说,所涉及的表是完全可配置的。这就是为什么我不能在这个任务之前创建POJO类。
在这种情况下,我认为唯一真正的方法是将每一行转换为带有分隔符(CSV、XML或其他)的字符串,然后创建字符串数组。
您可以获得JDBC查询返回的列名列表,如下所示:
https://stackoverflow.com/questions/24554084
复制相似问题