Я работаю над задачей синхронизации, чтобы выгрузить / загрузить данные из одного SQLServer2014 базы данных клиентского компьютера в другой SQLServer2014 на центральном онлайн-сервере, чтобы каждый раз вставлять около 36–50 тыс. Строк для обновления / вставки / удаления данных.
Процесс инициализируется пользователем в настольном приложении и при отправке в веб-приложение функция создает файл JSON, содержащий все имена таблиц базы данных с соответствующими столбцами и значениями. Обратите внимание, что столбцы и значения записываются в файл JSON только в том случае, если они не пусты или не равны нулю. Например:
{"SCHOOL":[],"PERSON":[{"PERSON_ID":1,"NAME":"PAUL","FUNCTION_ID":1},{"PERSON_ID":2,"NAME":"JOHN","AGE":20, "FUNCTION_ID":3}], "FUNCTION":["FUNCTION_ID":1,"NAME":"TEACHER"}
Процесс кода
Класс PHP читает файл JSON, получая все имена таблиц с содержимым для импорта, и преобразует его в массив, нормализующий его по именам сущностей, которые отображаются в веб-приложении PHP. Классы учения корреспондентов. (Я делаю этот процесс, чтобы увидеть, отображается ли таблица в доктрине (веб-приложении) и проверять каждый тип в базе данных, например: тип базы данных int должен быть преобразован в целое число в PHP, varchar
должен быть преобразован в строки ...)
например:
SCHOOL => School, PERSON => Person, FUNCTION => Function
Для каждого имени таблицы из настольного приложения, найденного в отображенном информационном классе Doctrine в веб-приложении, создается объект PHP (универсальный класс, содержащий зависимости, поля и типы и т. Д.)и хранится в массиве.
например:
[Person] => \Entity\Sinc Object
(
[fields] => Array
(
[PERSON_ID] => int
[NAME] => varchar(max)
)
[dependencies] => Array
......
После преобразования каждой таблицы и полей из данных JSON в имена сущностей и типы доктрин я генерирую все вставки во временную таблицу для каждого JSONdata.
например,
"PERSON":[{"PERSON_ID":1,"NAME":"PAUL","FUNCTION_ID":1} turns into
CREATE TABLE tempdb..#tmpPerson(PERSON_ID int NULL, NAME varchar(max) NULL, AGE int NULL, FUNCTION_ID int NULL)
INSERT INTO tempdb..#tmpPerson(PERSON_ID, NAME, FUNCTION_ID) VALUES (1,"PAUL", 1);
INSERT INTO tempdb..#tmpPerson(PERSON_ID, NAME, AGE, FUNCTION_ID) VALUES (2,"JOHN", 20, 3);
Использование tempDb для выполнения каждой операции, выбирающей нужные элементы перед миграцией данных
Примечание: Если столбецпуст в файле JSON, он не будет отображаться в команде вставки.
Я сохраняю каждую вставку в массив и запускаю foreach
для ее выполнения
//$entityManager from Doctrine... sqlInsertsArray contains every insert generated delimiteds with ;
function runInserts($entityManager, $sqlInsertsArray){
$errors = array();
foreach($sqlInsertsArray as $key => $sql){
try{
$stmt = $entityManager->getConnection()->prepare($sql);
$stmt->execute();
$stmt->closeCursor();
}catch(Exception $e){
$errors[$key] = $e;
}
}
$entityManager->flush();
$entityManager->clear();
return $errors;
}
Вопросы:
Каков наилучший способ запустить / вставить эти данные в базу данных?
Выполнение каждой строки SQL, например, очень медленное и слишком продолжительное
много раз в зависимости от размера данных.
Должен ли я архивировать каждуюSQL в файл SQL. Попробуйте по-другому?
Есть ли способ выполнить пакетную вставку с разными столбцами?
Приветствуются все дополнительные советы. Основными целями являются производительность и низкая стоимость, или одна из них.
В настоящее время у меня нет возможности изменить настольное приложение клиента, но я могу предложить изменения.