【问题标题】:ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO..."). Which is better to use?ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO...")。哪个更好用?
【发布时间】:2012-02-17 12:24:55
【问题描述】:

在使用 Java 插入或更新 DB(在我的情况下为 Oracle DB)中的数据时,最好使用:

  • ResultSet.insertRow()ResultSet.updateRow()
  • Statement.executeUpdate(....)

大多数时候我使用rs.insertRow()rs.updateRow(),这样就避免了编写查询的需要,但这在性能方面是否合理?

【问题讨论】:

    标签: java sql oracle jdbc resultset


    【解决方案1】:

    我从不对ResultSet 做任何事情,除了遍历它,将它映射到对象或数据结构中,然后关闭它。如果我想插入,我会使用PreparedStatement。我的ResultSets 永远不会停留足够长的时间来修改。我更喜欢保持持久性操作简短,以便我可以尽快关闭连接。我认为这种方法可以更好地扩展,因为多个用户以这种方式共享池连接更容易。

    【讨论】:

    • 感谢@duffymo 的快速回答。你说的很对,ResultSet 肯定很难跟踪和管理,这是 imo 最大的缺点之一。
    • 如果将它们放在一个方法的范围内,跟踪会更容易:创建它们,映射数据,然后在 finally 块中关闭它们。你不会那样泄漏资源。 SQL 工件不应泄漏到持久层之外。
    • 确实如此,但我的意思是,如果我碰巧忘记了一个打开的 ResultSet,那么很难找到它来关闭它,尤其是在应用程序非常大的情况下。到目前为止,我还没有找到任何合理的方法来追踪打开的 ResultSets。
    • 如果您在一种方法的范围内完成所有操作,则更容易找到和修复。如果您使用 Spring SimpleJdbcTemplate,问题会为您解决。您的应用程序可能是“大”的,但这就是您将这些东西分层的原因。这就像纽约市的社区:肯定有数百万人,但您只关心您所在的街区。
    【解决方案2】:

    我认为部分原因在于结果集有多大。如果您要遍历 300 万条记录,我会使用 rs.updateRow() 而不是执行 300 万次查询。

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2012-07-06
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2015-11-09
      相关资源
      最近更新 更多