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...")。哪个更好用?的主要内容,如果未能解决你的问题,请参考以下文章