【问题标题】:JDBC connection default autoCommit behaviorJDBC 连接默认的 autoCommit 行为
【发布时间】:2012-06-16 18:57:38
【问题描述】:

我正在使用 JDBC 连接到 Oracle。我测试了connection.setAutoCommit(false)connection.setAutoCommit(true),结果符合预期。

虽然默认连接应该像autoCommit(true) [纠正我,如果我错了],但在调用connection.commit() 之前没有插入任何记录。关于默认行为的任何建议?

String insert = "INSERT INTO MONITOR (number, name,value) VALUES (?,?,?)";

conn = connection; //connection  details avoided
preparedStmtInsert = conn.prepareStatement(insert);
preparedStmtInsert.execute();

conn.commit();

【问题讨论】:

  • 你能把你实际使用的代码显示在它不起作用的地方吗?自动提交仅在语句执行后发生。
  • 您是否在connection details avoided 部分中做了任何影响自动提交设置的事情?
  • 你没有发布最有趣的部分——创建连接的代码;)
  • 没有。它只有网址,密码详细信息。(其他数据库设置对我不开放)

标签: oracle jdbc autocommit


【解决方案1】:

来自Oracle JDBC documentation

创建连接时,它处于自动提交模式。这意味着 每个单独的 SQL 语句都被视为一个事务,并且是 执行后立即自动提交。 (为了更 准确地说,默认是在 SQL 语句提交时提交 完成,而不是执行时。当所有的语句完成时 已检索到其结果集和更新计数。在几乎 然而,在所有情况下,声明都已完成,因此已提交, 执行后立即执行。)

另一件事是 - 你省略了连接创建细节,所以我只是猜测 - 如果你正在使用一些框架,或者从数据源或连接池获取连接,autocommit 可能会被 off那些框架/池/数据源 - 解决方案是永远不要相信默认设置;-)

【讨论】:

  • 所以我应该把它作为默认值,在所有情况下都可能与 autocommit true 不同。 [类似于java中的默认与公共]?
  • 默认值应该相同(autocommit=true),因为这是 JDBC 规范所说的。但是,JDBC 规范不适用于框架、连接池和数据源。例如,在 JBoss 中定义数据源时,您可以在数据源 XML 文件中显式地将 autocommit 设置为 false,并且您将从池中获取的连接默认情况下将其关闭。
猜你喜欢
  • 2023-03-08
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多