Java中的流式DAO结果(设计模式)

Java中的流式DAO结果(设计模式),java,design-patterns,jdbc,export,dao,Java,Design Patterns,Jdbc,Export,Dao,鉴于以下情况: DAO,它查询表中的所有行并将它们映射到域对象列表(纯JDBC) 一种处理DAO产生的列表并将某些列表元素格式化为文件的服务 这里的问题是,所有DAO结果都保存在内存中,随着表的增长,内存会变得很危险 问题:是否有一种模式可以以流式方式从DAO读取对象,即服务一次只处理一个元素,将其写入文件输出流,然后从结果集中请求下一个元素?一般来说,使用ResultSet作为DAO的返回类型是一个好主意吗?所以只处理一次给定的行?您可以在数据库中将该行标记为已处理,并且只选择未处理的行。

鉴于以下情况:

  • DAO,它查询表中的所有行并将它们映射到域对象列表(纯
    JDBC
  • 一种处理DAO产生的列表并将某些列表元素格式化为文件的服务
这里的问题是,所有DAO结果都保存在内存中,随着表的增长,内存会变得很危险


问题:是否有一种模式可以以流式方式从DAO读取对象,即服务一次只处理一个元素,将其写入文件输出流,然后从结果集中请求下一个元素?一般来说,使用
ResultSet
作为DAO的返回类型是一个好主意吗?

所以只处理一次给定的行?您可以在数据库中将该行标记为已处理,并且只选择未处理的行。或者,您可以将处理过的行移动到另一个表。

这样您只处理一次给定的行?您可以在数据库中将该行标记为已处理,并且只选择未处理的行。或者,您可以将处理过的行移动到另一个表。

最好的方法是进行分页查询,您可以获取行总数,然后选择页面大小并使用数据库工具(rowid for oracle)要获取页面直到您拥有所有行,或者您可以继续查询直到没有结果。

最好的方法是进行分页查询,您可以获取总行数,然后选择页面大小并使用数据库工具(rowid for oracle)要获取页面直到您拥有所有行,或者您可以继续查询直到没有结果。

我永远不会从DAO返回
ResultSet
,请将数据逻辑封装在数据类中

我可能也不会写一个返回整个表的DAO方法,这似乎有点过于通用。相反,我可能会编写一个名为
dumpToFile(File f)
的DAO方法,在内部完成整个工作。这样,DAO可以一次读取一条记录并将其写入文件。

我永远不会从DAO返回
ResultSet
,而是将数据逻辑封装在数据类中


我可能也不会写一个返回整个表的DAO方法,这似乎有点过于通用。相反,我可能会编写一个名为
dumpToFile(File f)
的DAO方法,在内部完成整个工作。通过这种方式,DAO可以一次读取一条记录并将其写入文件。

即使您公开了结果集(您不应该这样做),默认情况下仍然无法获得流语义。为此,您需要执行以下操作:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
您应该将其封装在DAO中,您可以返回一个自定义迭代器来处理结果


请参阅流式处理结果主题上的。

即使您公开了不应该公开的结果集,默认情况下仍然无法获得流式处理语义。为此,您需要执行以下操作:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
您应该将其封装在DAO中,您可以返回一个自定义迭代器来处理结果


请参阅流式处理结果主题上的。

假设服务正在执行某些验证,由于业务规则跳过某些记录并对其进行格式化。当应用关注点分离的概念时,这些不是DAO中要做的事情。这就是我要问的原因。假设服务正在执行某些验证,由于业务规则跳过一些记录并格式化它们。当应用关注点分离的概念时,这些不是DAO中要做的事情。这就是我为什么要问的。那么DAO接口会是什么样子?请记住,我希望在业务逻辑(服务)和查询逻辑(DAO)之间保持分离。那么DAO接口会是什么样子?请记住,我希望在业务逻辑(服务)和查询逻辑(DAO)之间保持分离。您的建议意味着每行至少有一次更新。当您有10万行或百万行时,这听起来不是很有效。这一点很好。此页面上的其他选项看起来更可取。您的建议意味着每行至少有一次更新。当您有10万行或百万行时,这听起来不是很有效。这一点很好。这个页面上的其他选项看起来更理想。谢谢!我也有同样的感觉,公开结果集不是个好主意。迭代器是一个很好的技巧!我仍然在想,仅仅从DB查询逻辑中分离(一点)BL是否值得。我假设一般情况下,人们只是在一个类中混淆了这一点?一般来说,BL和DB逻辑并没有交织在一起。从DAO返回自定义迭代器将是最简单、最干净的解决方案。Thx!我也有同样的感觉,公开结果集不是个好主意。迭代器是一个很好的技巧!我仍然在想,仅仅从DB查询逻辑中分离(一点)BL是否值得。我假设一般情况下,人们只是在一个类中混淆了这一点?一般来说,BL和DB逻辑并没有交织在一起。从DAO返回自定义迭代器将是最简单、最干净的解决方案。