【问题标题】:Batch prepared statement auto commit批量准备好的语句自动提交
【发布时间】:2023-03-26 13:36:01
【问题描述】:

我正在尝试通过 java.sql 准备好的语句批处理执行创建多个表(最多 20 个)。大多数表都是相互关联的。但我心里有些疑惑。

1) 设置连接自动提交是真还是假? 2) BatchExecute 有什么特殊的模式吗?喜欢上下。我想父表创建查询必须先执行。 3) 如果出现错误,所有批次都回滚?

【问题讨论】:

  • 据我了解,并不是所有的RDBMS数据定义语言都可以在一个事务中进行。
  • 这似乎是一件奇怪的事情。如果您希望他们都重新扮演角色,那么您应该将 autocommit 设置为 false。但是像这样乱用数据库目录可能会导致问题。
  • 所以有更好的方法来创建表格。请给我建议。
  • 为什么要创建表?
  • 对我来说,“每个用户的表”解决方案听起来像是一个设计问题。

标签: java jdbc prepared-statement


【解决方案1】:

自动提交的批处理执行行为是实现定义的,一些驱动程序甚至可能不支持。所以如果你想使用批处理执行,请将自动提交设置为 false。

也就是说,有些数据库会隐式提交每个 DDL 语句;这可能会干扰批处理执行的正确工作。我建议采取安全路线,不要对 DDL 使用批处理执行,而是使用普通的 Statementexecute(String) 来执行 DDL。

【讨论】:

    【解决方案2】:

    实际上在这种情况下使用批处理执行没有多大意义。一次插入或更新数千行时,批处理执行可以为您提供(大)性能改进。 您只需要将所有语句都包含在事务中:

    1. 调用 Connection.setAutoCommit(false)
    2. 使用 Statement.executeUpdate 执行您的创建表语句
    3. 调用 Connection.commit()

    您需要根据它们之间的外键自行对 create-table 语句进行排序。 正如 Mark 指出的那样,您使用的数据库可能会立即提交每个创建表并忽略该事务。并非所有数据库都支持表的事务创建。您需要对此进行测试或进行更多研究。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多