Какое максимальное количество наборов параметров может быть добавлено в пакетное обновление PreparedStatement? - PullRequest
2 голосов
/ 15 марта 2012

Мне нужно выполнить более 100000 операторов вставки, например, следующее через jdbc:

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();  

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

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

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

Максимальный размер пакета по умолчанию для 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.Другие базы данных могут иметь другие настройки.

2 голосов
/ 15 марта 2012

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

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

1 голос
/ 15 марта 2012

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

1 голос
/ 15 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...