Использование данных нагрузки MySQL
В базах данных наиболее распространенным способом записи данных является запись через SQL Insert и, кроме того, восстановить базу данных через файлы резервного копирования. Этот файл резервного копирования является сценарием SQL в MySQL, но он фактически выполняется в операторах пакетных вставки.
На практике часто возникают два типа проблем: один из них является импортом данных, такими как импорт данных из Word, таблица Excel или документы TXT (эти данные обычно поступают из документов, введенных нетехническим персоналом с помощью офисных инструментов); Другим является обмен данными, например, обмен данными между базами данных MySQL, Oracle и DB2.
Это сталкивается с проблемой: существуют различия в сценариях SQL базы данных, а обмен SQL более хлопот. Однако почти все базы данных поддерживают экспорт текстовых данных (нагрузка) (экспорт). Используя это, мы можем решить проблемы обмена данными и импорта, упомянутые выше.
Оператор загрузки MySQL DataInFile используется для чтения строк из текстового файла на высокой скорости и загрузки их в таблицу. Имя файла должно быть буквальной строкой. Ниже приведен пример описания MySQL5, которое иллюстрирует, как использовать команду MySQL LoadData для реализации импорта текстовых данных.
Примечание. Упомянутый здесь текст - это текст с определенным форматом, таким как ветви текста, каждая строка разделена с одним и тем же символом и т. Д. Итак, есть много способов получить такой текст, такие как сохранение таблиц Word и Excel в текст или файл CSV.
В проекте используется среда для быстрого загрузки файла CSV. Оригинальная система использовала базу данных DB2, а затем функция, аналогичная LoadData MySQL, называется sysproc.db2load. Тем не менее, LoadData не может использоваться в хранимых процедурах MySQL. Этот метод вызывается в коде Java при принятии метода.
Пример реализации:
Подготовьте тестовую форму
SQL выглядит следующим образом:
USE test;CREATE TABLE `test` (`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,`a` int(11) NOT NULL,`b` bigint(20) UNSIGNED NOT NULL,`c` bigint(20) UNSIGNED NOT NULL,`d` int(10) UNSIGNED NOT NULL,`e` int(10) UNSIGNED NOT NULL,`f` int(10) UNSIGNED NOT NULL, первичная клавиша (`id`), клавиша` a_b` (`a`,` b`)) Engine = innodb auto_increment = 1 charset = utf8
Код Java выглядит следующим образом:
Пакет com.seven.dbtools.dbtools; import org.apache.log4j.logger; импорт org.springframework.jdbc.core.jdbctemplate; импорт java.io.bytearrayinptstream; import java.io.inptream; импорт. java.sql.sqlexception; import javax.sql.datasource;/** * @author Seven * @since 07.03.2013 */public Class BulkloadData2mysql {private Static Final Logger = logger.getLogger (BulkloadData2mysql.class); Частный jdbctemplate jdbctemplate; частное соединение conn = null; public void setDataSource (DataSource DataSource) {this.jdbctemplate = new jdbctemplate (dataSource); } public static inputStream getTestDatainputStream () {StringBuilder Builder = new StringBuilder (); for (int i = 1; i <= 10; i ++) {for (int j = 0; j <= 10000; j ++) {builder.append (4); builder.append ("/t"); Builder.Append (4 + 1); builder.append ("/t"); Builder.Append (4 + 2); builder.append ("/t"); Builder.Append (4 + 3); builder.append ("/t"); Builder.Append (4 + 4); builder.append ("/t"); Builder.Append (4 + 5); builder.append ("/n"); }} byte [] bytes = builder.toString (). getBytes (); InputStream IS = New BytearRayinputStream (байты); Возврат есть; } / ** * * * Загрузите объемные данные от InputStream в MySQL * / public int BulkloadFrominputStream (String LoadDatASQL, inputStream DataStream) выбрасывает sqlexception {if (dataStream == null) {logger.info («inputStream is null, данные не импортированы»); возврат 0; } conn = jdbctemplate.getDatasource (). getConnection (); Заглавный оператор подготовки = conn.prepareStatement (LoadDatASQL); int result = 0; if (ratement.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedStatement mysqlStatement = ratement.unwrap (com.mysql.jdbc.preparedstatement.class); mysqlstatement.setlocalinfileinputstream (dataStream); result = mysqlstatement.executeUpdate (); } return Result; } public static void main (string [] args) {String testSql = "Загрузить данные локально инфиль 'sql.csv' игнорировать в таблице тест. test (a, b, c, d, e, f)"; InputStream dataStream = getTestDataInputStream (); BulkloadData2mysql DAO = new BulkLoadData2mysql (); try {long bomintime = system.currenttimemillis (); int rous = dao.bulkloadfrominputstream (testsql, datastream); Long EndTime = System.CurrentTimeMillis (); logger.info («Импортирование» + Rows + «Rows Data в MySQL и стоимость» + (EndTime - BERINTIME) + "MS!"); } catch (sqlexception e) {e.printstacktrace (); } System.Exit (1); }}намекать:
Код в примере использует метод SetLocalInfileInputStream, который напрямую игнорирует имя файла и импортирует поток IO в базу данных. В фактической реализации вы также можете загрузить файл на сервер, затем прочитать файл, а затем импортировать файл. В настоящее время локальный параметр данных нагрузки должен быть удален, и имя файла должно быть именем полного абсолютного пути.
Наконец, прикреплен синтаксис инвиля нагрузки данных
Загрузить данные [low_priority | Одновременно] [local] infile 'file_name.txt' [Заменить | Игнорировать] в таблицу TBL_NAME [Fields [завершены «string»] [[необязательно] заключенным «char '] [сбежать от' char ']] [lines [string by' string '] [завершено' string ']] [игнорировать номера] [(col_name_or_user_var, ...)] [set col_name = expr, ...]]]
Суммировать
LoadData - очень полезная команда. Импортировать данные из файла быстрее, чем оператор вставки. Документация MySQL говорит, что она примерно в 20 раз быстрее. Тем не менее, есть много вариантов для команд, но большинство из них нельзя использовать. Если вам это действительно нужно, просто прочитайте официальную документацию при использовании.