2015-02-11 3 views
0

Я использую java.sql.Connection.setAutoCommit(false) и java.sql.PreparedStatement.addBatch() для выполнения некоторых объемных вставок. Я предполагаю, сколько правильных операторов вставки/обновления можно безопасно выполнить перед фиксацией? Например, выполнение 100 000 вставок перед фиксацией может привести к жалобе драйвера JDBC или утечке памяти или что-то еще? Я предполагаю, что существует ограничение на количество операторов, которые я могу выполнить перед фиксацией, где я могу найти такую ​​информацию?JDBC до предела

+0

Не можете ли вы проверить это? Это будет зависеть от: a) ваших данных; b) базы данных и т. Д. – davek

+0

Это зависит от того, насколько велики каждое утверждение. Если у вас только 5 целых столбцов, вы, вероятно, не столкнетесь с проблемой. Если у вас есть 100 столбцов с 'varchar (1000)', тогда все будет выглядеть по-другому. Это также зависит от используемой СУБД. Некоторые из них быстрее, если вы только совершаете ** один раз **, другие быстрее, если вы совершаете часто. –

ответ

1

Существует no ограничение на количество DML утверждений. Каждый INSERT/UPDATE/DELETE, который вы нажимаете на базу данных, фактически отслеживается только в базе данных. Таким образом, утечки памяти, как вы упомянули, не будет. Утечка памяти в JDBC обычно может быть связана с незакрытыми наборами результатов или только с подготовленными инструкциями.

Но с другой стороны, столько из DML операций без COMMIT, могло бы сделать так много регистрации в БД. И это может повлиять на производительность других операций. Когда вы выпустите COMMIT после того, как скажете миллионам из INSERTs, другие операции, такие как INDEX анализ, репликация данных (если есть) поставит больше накладных расходов на DBMS. Тем не менее эти очки полностью соответствуют DBMS. JDBC У водителя нет ничего общего.

+0

Это неправда. При использовании пакетных операторов ** все ** операторы (на самом деле _values_ для операторов), добавленные через 'addBatch()', хранятся в памяти драйвером до вызова 'executeBatch()'. –

+0

В DB2 я получил * java.sql.SQLException: предел превышения количества заявлений. * – agad

+0

@a_horse_with_no_name да Я согласен, что они находятся в драйвере. Но они просто заявления (текст), не должны создавать накладные расходы на 'JVM', возможно ?! И если бы какой-либо предел был бы только параметром «СУБД» (только для DBA?). –