首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >封装JDBC结果集

问封装JDBC结果集
EN

Stack Overflow用户
提问于 2014-07-03 20:45:39
回答 3查看 524关注 0票数 1

我有一个非常常见的封装问题。我正在通过jdbc查询表,并且需要在内存中保留记录一段时间以进行处理。我没有为同一个表提供任何hibernate POJO来创建任何对象和保存。我说的是一个查询中的负载,比如说2亿。

常见的方法是创建一个对象数组,并在需要使用它们时进行强制转换。(假设我可以获得表的详细信息,如列名和数据类型,这些信息将保存在一些参考表中。)但考虑到负载,我猜这种方法将非常昂贵(时间)。

任何好的方法都会受到赞赏。

EN

回答 3

Stack Overflow用户

发布于 2014-07-03 21:13:13

听起来像是CachedRowSet可以在这里完成这个任务。这几乎就是你想要的。它需要一个ResultSet,然后把整个东西吸下来,然后你就可以在空闲的时候处理它了。

附录:

我真的在寻找一个健壮的记录持有者,易于访问的成员

但这几乎就是CachedRowSet的真正含义。

它管理具有命名(和编号)列的记录集合,并提供对这些列的类型化访问。

代码语言:javascript
复制
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到底是如何不能满足您的需求的?

票数 1
EN

Stack Overflow用户

发布于 2014-07-03 20:52:43

如果你在内存中需要200m的对象,那么你可以在迭代ResultSet的时候初始化每个对象--你不需要保存元数据

代码语言:javascript
复制
 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
EN

Stack Overflow用户

发布于 2014-07-03 21:06:55

更清楚地说,所涉及的表是完全可配置的。这就是为什么我不能在这个任务之前创建POJO类。

在这种情况下,我认为唯一真正的方法是将每一行转换为带有分隔符(CSV、XML或其他)的字符串,然后创建字符串数组。

您可以获得JDBC查询返回的列名列表,如下所示:

Retrieve column names from java.sql.ResultSet

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24554084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档