Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 封装JDBC结果集_Java_Arrays_Jdbc_Resultset_Encapsulation - Fatal编程技术网

Java 封装JDBC结果集

Java 封装JDBC结果集,java,arrays,jdbc,resultset,encapsulation,Java,Arrays,Jdbc,Resultset,Encapsulation,我有一个非常常见的封装问题。我通过jdbc查询一个表,需要将记录保存在内存中一段时间进行处理。我没有任何hibernate POJO用于同一个表来创建任何对象和保存。我说的是一次查询的负载,比如说2亿 常用的方法是创建一个对象数组,并在需要时进行转换。(假设,我可以获得表的详细信息,如列名和数据类型,这些信息将保存在一些参考表中。)但我想,当考虑到负载时,这种方法将非常昂贵(时间) 任何好的方法都会受到欢迎…好吧,如果您需要在内存中存储2亿个对象,那么您可以在迭代结果集时对每个对象进行初始化-您

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

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


任何好的方法都会受到欢迎…

好吧,如果您需要在内存中存储2亿个对象,那么您可以在迭代结果集时对每个对象进行初始化-您不需要保存元数据

 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();

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

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

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

听上去像是a会在这里起作用。这正是你想要的。它将需要一个结果集,并把整个事情都吸下去,然后你可以在空闲时处理它

增编:

我真的在寻找一个强大的记录持有人,方便访问的成员

但这正是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会提供你想要的一切。如果您不想实际将数据加载到RAM中,可以使用ResultSet


唯一的缺点是它不是线程安全的,所以您需要围绕它进行同步。但这就是生活。CachedRowSet究竟如何才能满足您的需要?

我关心的是处理所需的时间,假设我在系统中有足够的内存…您将需要大量内存才能在内存中保留2亿行。暂时忘掉内存吧。。我可以启动多个查询并创建线程。。。问题是如何在不创建对象数组的情况下将记录保存在内存中。如果我可以避免在类型转换项目时花费时间,这将是一件好事,因为每个记录中都有许多列。你可能猜错了类型转换非常昂贵,看不,伙计,我不能这样做。我无法创建类(在您的示例中是MYClass)并部署它。我已经提到,我没有为相关表创建POJO。更清楚地说,所涉及的表是完全可配置的。这就是为什么我不能在此任务之前创建POJO类的原因。谢谢你的回答。。但这同样是一个耗时的过程。。如前所述,我将对这些记录进行处理。在本例中,假设我将其存储为分隔字符串,那么每次我都必须解析该字符串以获得各个列。然后,我必须再次将字符串转换为所需的数据类型,这或多或少与将数据存储在对象数组中相同。。。这有意义吗?也许这需要从另一个角度来看待。你需要做什么样的处理?我会做一些商业计算。我不想把这里的事情复杂化。简单地说,我会根据一些键将一个记录拆分成多个…谢谢你的评论…但我担心这对我没有帮助。让我举个例子说明一下。假设该表包含列名称、年龄和出生日期。现在,结果集有三行。我不想缓存它,因为我的处理可以是线程化的,甚至我可以触发多个查询。我将如何将这三列存储在内存中,并在需要时使用它们,而不会出现复杂情况。对象数组是一种解决方案,但类型转换是一个问题。我真的在寻找一个健壮的记录持有者,可以轻松访问Members。如果我可以编译并保持一个类的运行,并对其进行处理(创建该类对象的数组),那么问题就解决了。但要做到这一点,我应该尝试反思和所有,这将是一个开销。我只是想知道是否还有其他更好的方法。我知道CachedRowSet..但正如我前面提到的,我的内存没有任何问题。。我可以处理结果集..如何知道名称的类型是字符串。在我的情况下,我将不知道这一点,因此我不能调用getString。例如,一行将是James,25,10/10/1988-我如何知道第一行是String,下一行是int,第三行是date…列的数量是可配置的,并且可以变化。。。我可能知道列名和类型。您可以从行集中获取元数据,它将告诉您列的类型(由数据库报告)。