当我们承诺时会发生什么?

时间:2019-02-26 23:16:35

标签: java sql oracle jdbc connection

我试图了解我们提交时到底发生了什么

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement 1");
ps.executeUpdate();
PreparedStatement ps2=connection.prepareStaement("insert statement 2");
ps2.executeUpdate();
conn.commit();
conn.close();

这两个准备好的语句如何到达数据库?

将它们合并到一个数据库调用中吗?还是将它们分别插入? 我的印象是他们将一次访问数据库。该数据库接收到以下内容:

START TRANSACTION
insert statement 1
insert statement 2
COMMIT

此外,上一个与此电话有何不同,在此电话上发生了多少通话:

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement ?");
ps.setString(1,"1");
ps.addBatch();
ps.setString(1,"2");
ps.addBatch();
ps.executeBatch();
conn.commit();
conn.close();

1 个答案:

答案 0 :(得分:1)

除连接/断开连接外,在第一种情况下(准备,执行,准备,执行,提交)有5个数据库调用,在第二种情况下(准备,执行,提交)有3个数据库调用。实际上,这有点偏颇:为了使示例具有可比性,您将需要在第一种情况下两次运行同一条语句,从而节省了一个准备。另外,正如Andreas所评论的那样,某些驱动程序可能不会发出数据库调用以进行准备,而是将其与第一次执行结合在一起。

无论如何,从概念上讲,第二种情况比第一种情况少数据库调用

交易是服务器端功能。使用事务时,对数据库的更改仅对执行它们的会话可见。调用COMMIT时,它们将变为永久性的,并且对其他用户可见。另一方面,拥有会话可以选择ROLLBACK,这基本上意味着:我确定放弃自上次COMMIT起所做的更改。您可以看到每个代码段都在单个数据库事务中发生。从这个角度看,它们没有什么不同。

从客户端到服务器的每个调用都需要一个网络往返,这在运行许多小型操作(例如,一组INSERT)时可能会很昂贵。这是批处理发挥作用的地方:它们允许在一次调用数据库中执行多项操作。在这方面,第二个代码段可能会更好地扩展,因为无论要处理的记录数量如何,第二个代码段始终执行相同数量的数据库调用。