2012-03-15 2 views
2

мне нужно выполнить более 100000 операторы вставки, как следующий через JDBC: Что такое максимальное количество наборов параметров, которые могут быть добавлены в пакетное обновление PreparedStatement?

Connection connection = datasource.getConnection(); 
String sql = "Insert Into Table (ColA, ColB) Values(?, ?)"; 
String[][] params = /*some array*/ 

PreparedStatement statement = connection.prepareStatement(sql); 
for(String[] var : params) 
{ 
    statement.setString(1, var[0]); 
    statement.setString(2, var[1]); 
    statement.addBatch(); 
}  

statement.executeBatch(); 

Я думал, что это будет общий вопрос, но я не могу найти какой-либо определенный ответ на этот вопрос. Это проект кросс-базы данных.

ответ

2

Я думаю, что единственным ограничением будет рабочее пространство и память на диске. см. это обсуждение: http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/d16af627-d374-4ac2-ba6d-017729fe3206

Вы должны иметь возможность имитировать это с помощью единичного теста (JUnit). Управление этим путем транзакции также сэкономит вам большую головную боль, если он умрет на полпути.

+0

Спасибо за ссылку – JayAgl

1

Это, вероятно, не общий вопрос, потому что есть другие способы сделать это. Мое личное предложение состояло в том, чтобы создать хранимую процедуру, которая принимает подготовленные данные (например, XML-документ) и делает это в истинном пакетном формате.

+0

Сохраненные procs тоже были бы моими префиксами, но у нас нет никаких предварительных предложений по базе данных, которые мне не разрешили каким-либо образом изменить. – JayAgl

+0

:(Извините, что слышали об этом. Обычно привилегии на db заблокированы до хранимые процедуры, поскольку прямой TSQL более опасен ... –

3

Это будет зависеть от вашего параметра MAX_ALLOWED_PACKET в MySQL (если это то, что вы используете).

Максимальный размер пакета max для MySQL составляет 16 МБ на клиенте.

Вы можете обновить значение либо:

[mysqld] 
max_allowed_packet=64M 

или

mysql --max_allowed_packet=64M 

http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

Конечно это если вы используете MySQL. Другие базы данных могут иметь разные настройки.

+0

Мне не разрешено изменять любые настройки базы данных. Также это проект кросс-базы данных - в основном d ealing с db2, oracle и SQL Server. Но спасибо, указав мне на переменную MAX_ALLOWED_PACKET, должны быть схожие переменные для других dbs, – JayAgl

+1

Человек, который жестко не контролирует БД. Лучшее, что я мог сказать вам, - разбить свои 100 тыс. Заявлений на партии 500 или что-то еще. Конечно, я бы сначала тестировал его с использованием разных драйверов JDBC, чтобы убедиться, что он работает для всех ваших баз данных, которые вы используете. Удачи! – bsimic

1

Это действительно зависит от нескольких факторов, в которых работает приложение. Поскольку вы в основном имеете дело со String, вы должны иметь возможность получить строку Integer.MAX_VALUE [всегда 2147483647 (2^31 - 1] по спецификации Java, максимальный размер массива, который класс String использует для внутреннего хранилище] или половину вашего максимального размера кучи (так как каждый символ имеет два байта), в зависимости от того, что меньше. Убедитесь, что в дизайне вашего приложения использование jvm в куче не превышает выделенное или вы получите ошибку в памяти.

+0

Я не вижу, как это имеет отношение к String. – JayAgl

+0

Параметр 'setString' -' String', этот параметр в конечном итоге будет преобразован в байты внутри, прежде чем он будет отправлен в базу данных. Объект 'statement' будет использовать больше кучи, поскольку вызывается больше' setString'. Поэтому, чтобы ответить на то, что является максимальным количеством наборов параметров, которые могут быть добавлены в пакетное обновление 'PreparedStatement' в определенном порядке, я объясняю, рассказывая о влияющих факторах. – Jasonw

+0

Извините, исправьте меня, если я ошибаюсь - строки, которые будут добавлены в качестве параметров, уже находятся в памяти, если их размер будет проблемой, это не произойдет в то время, когда они создаются/читаются? Если да, то это не ограничивающий фактор для PreparedStatement, который будет связан с максимальным размером пакета для БД или каким-либо другим ограничением сети/БД? – JayAgl

Смежные вопросы

 Смежные вопросы