Connection.setAutoCommit(true) 是不是适用于 SQL 存储过程和函数?

Posted

技术标签:

【中文标题】Connection.setAutoCommit(true) 是不是适用于 SQL 存储过程和函数?【英文标题】:Does Connection.setAutoCommit(true) work for SQL stored procedures and functions?Connection.setAutoCommit(true) 是否适用于 SQL 存储过程和函数? 【发布时间】:2012-07-10 11:27:07 【问题描述】:

数据库是甲骨文。

我想将Connection.setAutoCommit 用于SQL 存储过程和函数。它会起作用吗?

对于调用程序,我使用CallableStatement

【问题讨论】:

【参考方案1】:

它不起作用,connection.setAutoCommit(true),在这个连接中是一个 Java 对象。你不能在存储过程中使用相同的。

我们有一个名为 autocommit 的 sql 系统变量,如果我们在编写存储过程时将其设置为 on,您的过程将自动提交您尝试执行的结果。

【讨论】:

【参考方案2】:

是的,它有效。实际上自动提交是默认开启的。这个chapter 会给你一个想法,但可以节省你一些时间:

默认情况下,JDBC 的自动提交功能是开启的,这意味着每条 SQL 语句在执行时都会被提交。如果您的程序执行了多个 SQL 语句,则可以通过关闭自动提交来实现小幅性能提升。

也请阅读 CallableStatement 部分:

您可能还记得,CallableStatement 对象用于执行数据库存储过程。我将 CallableStatement 对象保存到最后,因为它们是所有 JDBC SQL 执行接口中执行最慢的对象。这听起来可能违反直觉,因为通常认为调用存储过程比使用 SQL 更快,但事实并非如此。给定一个简单的 SQL 语句和一个完成相同任务的存储过程调用,简单的 SQL 语句总是执行得更快。为什么?因为使用存储过程,您不仅有时间执行 SQL 语句,还有时间处理过程调用本身的开销。

我认为这将有助于您就应用程序的性能做出决定。

【讨论】:

【参考方案3】:

一句话:是的。只要确保您没有在存储过程中嵌入事务逻辑即可。将这一切交给 JDBC 驱动程序或事务管理器。

没有什么比亲自尝试并看到更好的了。我认为这比在这里提问更好。

【讨论】:

以上是关于Connection.setAutoCommit(true) 是不是适用于 SQL 存储过程和函数?的主要内容,如果未能解决你的问题,请参考以下文章

当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了啥样的锁?

SQL事务

spring中的事务

Oracle系列:(20)事务

学习Spring5必知必会~Spring tx

JAVA 使用原生jdbc批量添加,表被锁住问题