Я использую java.sql.Connection.setAutoCommit(false)
и java.sql.PreparedStatement.addBatch()
для выполнения некоторых объемных вставок. Я предполагаю, сколько правильных операторов вставки/обновления можно безопасно выполнить перед фиксацией? Например, выполнение 100 000 вставок перед фиксацией может привести к жалобе драйвера JDBC или утечке памяти или что-то еще? Я предполагаю, что существует ограничение на количество операторов, которые я могу выполнить перед фиксацией, где я могу найти такую информацию?JDBC до предела
ответ
Существует no ограничение на количество DML
утверждений. Каждый INSERT/UPDATE/DELETE
, который вы нажимаете на базу данных, фактически отслеживается только в базе данных. Таким образом, утечки памяти, как вы упомянули, не будет. Утечка памяти в JDBC
обычно может быть связана с незакрытыми наборами результатов или только с подготовленными инструкциями.
Но с другой стороны, столько из DML
операций без COMMIT
, могло бы сделать так много регистрации в БД. И это может повлиять на производительность других операций. Когда вы выпустите COMMIT
после того, как скажете миллионам из INSERTs
, другие операции, такие как INDEX
анализ, репликация данных (если есть) поставит больше накладных расходов на DBMS
. Тем не менее эти очки полностью соответствуют DBMS
. JDBC
У водителя нет ничего общего.
Это неправда. При использовании пакетных операторов ** все ** операторы (на самом деле _values_ для операторов), добавленные через 'addBatch()', хранятся в памяти драйвером до вызова 'executeBatch()'. –
В DB2 я получил * java.sql.SQLException: предел превышения количества заявлений. * – agad
@a_horse_with_no_name да Я согласен, что они находятся в драйвере. Но они просто заявления (текст), не должны создавать накладные расходы на 'JVM', возможно ?! И если бы какой-либо предел был бы только параметром «СУБД» (только для DBA?). –
Не можете ли вы проверить это? Это будет зависеть от: a) ваших данных; b) базы данных и т. Д. – davek
Это зависит от того, насколько велики каждое утверждение. Если у вас только 5 целых столбцов, вы, вероятно, не столкнетесь с проблемой. Если у вас есть 100 столбцов с 'varchar (1000)', тогда все будет выглядеть по-другому. Это также зависит от используемой СУБД. Некоторые из них быстрее, если вы только совершаете ** один раз **, другие быстрее, если вы совершаете часто. –