ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO...")。哪个更好用?
Posted
技术标签:
【中文标题】ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO...")。哪个更好用?【英文标题】:ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO..."). Which is better to use? 【发布时间】:2012-02-17 12:24:55 【问题描述】:在使用 Java 插入或更新 DB(在我的情况下为 Oracle DB)中的数据时,最好使用:
ResultSet.insertRow()
、ResultSet.updateRow()
或
Statement.executeUpdate(....)
大多数时候我使用rs.insertRow()
和rs.updateRow()
,这样就避免了编写查询的需要,但这在性能方面是否合理?
【问题讨论】:
【参考方案1】:我从不对ResultSet
做任何事情,除了遍历它,将它映射到对象或数据结构中,然后关闭它。如果我想插入,我会使用PreparedStatement
。我的ResultSets
永远不会停留足够长的时间来修改。我更喜欢保持持久性操作简短,以便我可以尽快关闭连接。我认为这种方法可以更好地扩展,因为多个用户以这种方式共享池连接更容易。
【讨论】:
感谢@duffymo 的快速回答。你说的很对,ResultSet 肯定很难跟踪和管理,这是 imo 最大的缺点之一。 如果将它们放在一个方法的范围内,跟踪会更容易:创建它们,映射数据,然后在 finally 块中关闭它们。你不会那样泄漏资源。 SQL 工件不应泄漏到持久层之外。 确实如此,但我的意思是,如果我碰巧忘记了一个打开的 ResultSet,那么很难找到它来关闭它,尤其是在应用程序非常大的情况下。到目前为止,我还没有找到任何合理的方法来追踪打开的 ResultSets。 如果您在一种方法的范围内完成所有操作,则更容易找到和修复。如果您使用 Spring SimpleJdbcTemplate,问题会为您解决。您的应用程序可能是“大”的,但这就是您将这些东西分层的原因。这就像纽约市的社区:肯定有数百万人,但您只关心您所在的街区。【参考方案2】:我认为部分原因在于结果集有多大。如果您要遍历 300 万条记录,我会使用 rs.updateRow() 而不是执行 300 万次查询。
【讨论】:
以上是关于ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO...")。哪个更好用?的主要内容,如果未能解决你的问题,请参考以下文章
性能测试 - 响应 vs 延迟 vs 吞吐量 vs 负载 vs 扩展性 vs 压力 vs 健壮性
Atitit. visual studio vs2003 vs2005 vs2008 VS2010 vs2012
SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam