2015-02-11 85 views
0

我使用java.sql.Connection.setAutoCommit(false)java.sql.PreparedStatement.addBatch()来做一些批量插入。我猜在提交之前可以安全地执行多少个正确的插入/更新语句?例如,在提交之前执行100.000插入可能会导致JDBC驱动程序投诉或内存泄漏或其他问题?我想在提交之前可以执行多少条语句是有限制的,我可以在哪里找到这样的信息?JDBC到极限

+0

你不能以此为基准吗?它将取决于a)您的数据b)数据库等等。 – davek 2015-02-11 09:53:11

+0

这取决于每个语句的大小。如果你只有5个整数列,那么你可能不会遇到问题。如果你有100个'varchar(1000)'列,那么情况就会有所不同。它也取决于正在使用的DBMS。如果你只提交一次**,有些速度会更快;如果你频繁提交,其他速度会更快。 – 2015-02-11 09:59:39

回答

1

还有没有限制在DML声明的数量。您推送到数据库的每个INSERT/UPDATE/DELETE实际上仅在数据库中进行跟踪。所以不会像你提到的那样有任何内存泄漏。 JDBC中的内存泄漏通常只与未关闭的结果集或预准备语句相关。

但是另一方面,如此多的DML操作没有COMMIT,可以做很多日志记录在数据库中。这可能会影响其他业务的表现。当你在百万INSERTs之后发出COMMIT时,其他操作如INDEX分析,数据复制(如果有的话)会给DBMS增加更多开销。仍然这些点完全是DBMS具体。 JDBC驱动程序与此无关。

+0

这是不正确的。当使用批处理语句** all **时,通过'addBatch()'添加的语句(实际上是语句的_values_)被驱动程序保存在内存中,直到调用executeBatch()为止。 – 2015-02-11 09:58:46

+0

在DB2中,我得到* java.sql.SQLException:超出语句数限制。* – agad 2015-02-11 10:02:33

+0

@a_horse_with_no_name是的,我同意他们在驱动程序中。但它们只是语句(文本),不应该为'JVM'创建一个开销?!并且,如果任何限制都只是一个'DBMS'参数(由DBA定制?)。 – 2015-02-11 10:06:43