Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 结果集与行集:选择哪一个以及何时选择?_Java_Spring_Jdbc_Spring Jdbc_Rowset - Fatal编程技术网

Java 结果集与行集:选择哪一个以及何时选择?

Java 结果集与行集:选择哪一个以及何时选择?,java,spring,jdbc,spring-jdbc,rowset,Java,Spring,Jdbc,Spring Jdbc,Rowset,因此,我意识到一些相对的差异,即,ResultSet与数据库有“开放连接”,而RowSet以“断开连接”的方式工作 但这正是我所理解的(可能是不正确的): 那么,我的问题是——在什么情况下,一个比另一个更可取?他们各自的优势/劣势是什么 从我感觉的行集,在 断开模式,尤其适用于 “只读”查询将具有 在高度竞争的环境中有更好的表现 并发系统。对吗? 如果是这样的话,可以这样说吗 行集始终优于 ResultSet是否用于只读查询 如果我正确的话,迭代 行集不会引发SQL异常, 但这是一种好处吗?

因此,我意识到一些相对的差异,即,
ResultSet
与数据库有“开放连接”,而
RowSet
以“断开连接”的方式工作

但这正是我所理解的(可能是不正确的):

那么,我的问题是——在什么情况下,一个比另一个更可取?他们各自的优势/劣势是什么

  • 从我感觉的
    行集
    ,在 断开模式,尤其适用于 “只读”查询将具有 在高度竞争的环境中有更好的表现 并发系统。对吗? 如果是这样的话,可以这样说吗
    行集始终优于
    
    ResultSet
    是否用于只读查询

  • 如果我正确的话,迭代
    行集
    不会引发SQL异常, 但这是一种好处吗?其他的 因为
    行集
    是可序列化的。 但我关心的主要是一个 从绩效角度看,什么是 选择

  • 但这对我来说重要吗 读写查询??你能同步数据吗 结果集是否返回到数据库?(我不是 当然,如果可能的话 我想不起来了,谷歌也不知道 这已经够好了:)已经有一段时间了 使用原始JDBC

有什么想法吗?很明显,我的知识中有一些缺失:)

我问这个问题的原因是,我想在实现SpringJDBC的
ResultsTextRactor
接口和在处理某些数据时返回
SqlRowSet
之间做出选择。这个问题让我好奇,除了扔硬币之外,如何决定什么时候选择:)

RowSet 几乎总是正确的选择,它功能更全面,具有您列出的所有优点,并且具有用于特殊目的的专用实现,如断开连接的
CachedRowSet
,当数据放入内存时,我总是使用它,因此,我可以尽快释放回池的连接,以便重用

ResultSet
不应成为公共合同的一部分。 连接的
ResultSet/Rowset
不应逃逸创建它们的方法或对象。至少使用
行集
可以断开它的连接,客户机不必关心实现*除非您正在编写交互或依赖于
ResultSet
特定功能或契约的
JDBC
特定库代码

如果您只是传输查询结果,
JDBC
特定类应该是公共契约的一部分

理想情况下,您希望将
行集/ResultSet
内容具体化为要传递的类型安全域对象。 在大多数情况下,您希望具体化要操作和使用的域对象的列表/集合,而不是将代码直接耦合到
JDBC
api


许多现代人使用
ResultSetMapper
类来处理使用
Visitor
模式生成类型安全域实例,因为这是惯用的处理方式。

我不同意JR的答案。行集通常是一个不错的选择,但与往常一样,最佳答案取决于您的情况和需要。对所有内容使用行集不会产生功能失调的代码,但它可以提供比ResultSet更慢的性能(常见的JdbcRowSet实现是ResultSet的包装器)

如果需要在需要JavaBean的模块化代码中使用结果对象,那么行集满足JavaBean的最低要求

如果您正在为多线程/服务器应用程序开发代码,那么您必须接受这样的让步:所有JavaBean都是可变的,因此不是线程安全的。因此,结果集和行集都不是线程安全的

如果您编写的代码使用数据库查询并将其转换为Java数据模型对象,以便在应用程序的其余部分中使用,那么行集的性能可能不如结果集

在我编写的许多代码中,当我收到JDBC数据库查询时,我只是简单地使用Resultset将retrievd行立即处理到数据模型对象列表中。结果集甚至不能在执行转换的方法调用中生存。在我看来,这是好的。。。因为resultset(以及因此而产生的行集)消耗了大量资源,您希望它们能够尽快用于gc

在这种模式下,我甚至不需要Resultset的任何更新功能,更不用说行集了。我只是在集合中向前迭代一次,并生成一个结果行列表


在某些情况下,行集是非常理想的。由于行集是可序列化的,表面上看起来是“轻量级的”,因此断开连接的CachedRowSet(例如)代表了一种相当有效的机制,用于在位置之间传输数据库查询结果,特别是如果您希望数据可以就地更新的话。当然,您也可以序列化和传输对象列表。

当某些旧的第三方API要求将其作为方法的输入时。连接的结果集不应转义在其中创建的方法,或者在更糟的情况下转义为拥有它们的对象,因此,它们永远不应该是公共api的一部分。如果不提供
getter
并使所有实例引用
private final
,那么所有JavaBean都是不可变的,并且引用的对象是不可变的,并发性也很容易。@Jarroderson“所有JavaBean都是不可变的…”。。。我一定不同意。当然,您可以通过初始化JavaBean对象,然后确保其状态永远不会更改,从而有效地使其成为最终对象。。。但是你会怎么做?您可以通过将线程安全状态机作为JavaBean类的一部分实现,或者通过使字段
final
使JavaBean模拟一个不可变的类(如您所建议的)来实现。在前一种情况下,它仍然可以是poss