Во -первых, для их сравнения вводятся три метода программирования партийного вставки JDBC. Конкретный контент заключается в следующем
Вставка пакета JDBC в основном используется для импорта и журнала данных, поскольку журналы обычно записываются в файле первым.
Я использовал драйвер JDBC MySQL 5.1.5, чтобы проверить три более часто используемых метода
Метод 1: Используйте PrediveStatement, чтобы добавить партии
try {class.forname ("com.mysql.jdbc.driver"); conn = drivermanager.getConnection (o_url, имя пользователя, пароль); conn.setautocommit (false); String sql = "Вставьте adlogs (ip, веб -сайт, yyyymmdd, час, object_id) значения (?,?,?,?)"; Подготовленное Statatement perst = conn.prepareStatement (sql, resultset.type_scroll_sensity, resultset.concur_read_only); for (int x = 0; x <size; x ++) {prest.setString (1, "192.168.1.1"); prest.setstring (2, "Localhost"); prest.setstring (3, "20081009"); prest.setint (4, 8); Prest.setString (5, "11111111"); prest.addbatch (); } prest.executebatch (); conn.commit (); conn.close (); } catch (sqlexception ex) {logger.getLogger (mylogger.class.getName ()). log (level.severe, null, ex); } catch (classnotfoundexception ex) {logger.getLogger (mylogger.class.getName ()). log (level.severe, null, ex); } Объясните значение следующих двух параметров при создании заявления:
Первый параметр указывает тип результатов. Варианты:
Type_forward_only: тип по умолчанию. Пывенный доступ разрешается только один раз и не повлияет на изменения, внесенные другими пользователями в базу данных.
Type_scroll_insensitive: позволяет первым или обратно двигаться в списке и даже конкретное позиционирование, такое как переход к четвертой записи в списке или перемещение двух записей назад из текущей позиции. Это не повлияет на изменения, внесенные другими пользователями в базе данных.
Type_scroll_sensity: например, type_scroll_insensity, позиционирование разрешено в записях. Этот тип влияет изменения, внесенные другими пользователями. Если пользователь удаляет запись после выполнения запроса, эта запись исчезнет с результатов. Аналогичным образом, изменения в значениях данных будут отражены в результатах.
Второй параметр устанавливает параллелизм результатов, который определяет, можно ли обновить результат. Варианты:
Concur_read_only: это значение по умолчанию, указано, что оно не может быть обновлено
Resultset concur_updatable: указывает, что результат может быть обновлен
Метод 2: Использование оператора для добавления пакетного метода
conn.setautocommit (false); Оператор stmt = conn.createStatement (resultset.type_scroll_sensity, resultset.concur_read_only); for (int x = 0; x <size; x ++) {stmt.addbatch («Вставка в adlogs (ip, веб -сайт, yyyymmdd, hour, object_id) } stmt.executebatch (); conn.commit ();Метод 3: Использование оператора напрямую напрямую
conn.setautocommit (false); Оператор stmt = conn.createStatement (resultset.type_scroll_sensity, resultset.concur_read_only); for (int x = 0; x <size; x ++) {stmt.execute («Вставка в adlogs (ip, веб -сайт, yyyymmdd, hour, object_id) } conn.commit (); Среднее время теста для вставки 100 000 фрагментов данных с использованием вышеуказанного метода:
Метод 1: 17.844S
Метод 2: 18.421S
Метод 3: 16.359s
Можно видеть, что вставка операторов партий JDBC не только не улучшает производительность, но и медленнее, чем когда не используется партия. Конечно, это может быть связано с методом реализации конкретных драйверов JDBC. Приложение - это мой тестовый код, который можно использовать для запуска на моем компьютере.
При выполнении пакетной вставки наиболее важным является автоматическое отмену представления, поэтому не должно иметь значения, используется ли использование партийного синтаксиса JDBC.
conn.setautocommit (false)
Я лично думаю, что первый метод является наиболее удобным и практичным.
Пример объяснения данных о вставке партийной вставки JDBC :
Недавно, когда я работал над программой для импорта данных Excel в базу данных, я готовился использовать пакетную вставку JDBC из -за большого количества данных. Таким образом, используется preparestatement.addbatch (); Когда добавляются 1 Вт детали данных, выполняется операция вставки, используется подготовленный statement.executebatch (). Я думал, что это будет быстро, но мне потребовалось более 30 минут, чтобы вставить 65 536 элементов данных, что было совершенно не отстает от моих ожиданий. Поэтому я спросил своих коллег, как они обрабатывали такой крупномасштабный импорт данных. Я обнаружил, что они также использовали обработку партийной вставки JDBC, но, в отличие от меня, они использовали Con.setAutocommit (false); затем подготовленный statement.executebatch (), а затем выполнил con.commit (); Итак, я попробовал еще раз, что такое чудо? Для импорта этих данных потребовалось полчаса, и после добавления этих двух предложений потребовалось всего 15 секунд, чтобы завершить их. Поэтому я проверил причину и нашел следующее объяснение онлайн:
* При импорте данных в INNODB убедитесь, что MySQL не включен режим автоматического коммит
Требуется бревно для промывки для диска для каждой вставки. Чтобы отключить автосоммит во время работы импорта, окружи его
Установите заявления о автокоммерте и совершении коммита:
Установить AutoCommit = 0;
... заявления о импорте SQL ...
СОВЕРШИТЬ;
В первый раз это именно потому, что нет setautocommit (false); Для каждого оператора вставки будет создан журнал на диск. Следовательно, хотя пакетная вставка установлена, его эффект похож на одну вставку, что приводит к очень медленной вставке.
Некоторые из кодов следующие:
String sql = "вставьте в таблицу *****"; con.setautocommit (false); ps = con.preparestatement (sql); for (int i = 1; i <65536; i ++) {ps.addbatch (); // вставить записи 1W один раз if (i % 10000 == 0) {ps.executebatch (); con.commit (); }} // вставить меньше 1 Вт данных ps.executebatch (); con.commit ();Вышеуказанное - просто гарнир, а затем «подавать» следует:
1. Тестирование данных написания партии
long start = System.currentTimeMillis (); Daorecord daorecord = new daorecord (); List <t> list = new ArrayList <t> (); for (int i = 1; i <= 1000; i ++) {for (int j = 1; j <= 1000; j ++) {t t = new t (); t.seti (i); t.setj (j); list.add (t); }} daorecord.insertbatch (list); System.out.println ("Time-Consuming:" + (System.CurrentTimeMillis ()-Start) + "MS"); 2. Платежный тест данных
public void insertbatch (list <t> list) {string sql = "insert в t (go, назад) значения (?,?)"; Dbhelper dbh = new dbhelper (sql); Соединение conn = dbh.returnconn (); try {conn.setautocommit (false); // Обратите внимание, что это предложение должно быть false, см. Первую ссылку подготовку ps = conn.preparestatement (sql); for (int i = 0; i <list.size (); i ++) {ps.setint (1, list.get (i) .geti ()); ps.setint (2, list.get (i) .getj ()); ps.addbatch (); if (i % 10000 == 0) {ps.executebatch (); conn.commit (); }} ps.executebatch (); conn.commit (); conn.close (); } catch (sqlexception e) {// todo автоматически сгенерированный блок Catch e.printstackTrace (); }}Таблица данных:
Экспериментальные результаты:
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.