Доктрина: Сохранение данных в нескольких базах данных (mysql/oracle) одновременно?

Можно ли настроить Symfony/Doctrine таким образом, чтобы записывать данные в две разные базы данных (mysql И оракул) одновременно, читая данные только из mysql? Намерение состоит в том, чтобы постоянно иметь актуальную копию в оракуле.

Альтернативным сценарием может быть копирование данных из mysql в oracle с помощью сценария cron с использованием Doctrine с использованием сценария cron. Возможно ли это без модификации php-кода Symfony?


person Nekudotayim    schedule 05.01.2021    source источник
comment
зачем вообще использовать symfony/doctrine? просто напишите CRON и используйте прямой php для создания резервных копий с использованием MySQL   -  person craigh    schedule 05.01.2021


Ответы (1)


Вы можете писать в две разные БД и читать только из одной из них, если хотите. Для этого вам нужно создать отдельный менеджер сущностей для каждого конкретного соединения. Посмотрите на этот ответ.

Внедрите ManagerRegistry в свои службы и/или контроллеры, чтобы избежать внедрения обоих менеджеров. Так:

public function __construct(ManagerRegistry $managerRegistry)
{
    $mySqlEm  = $managerRegistry->getManager('default');
    $oracleEm = $managerRegistry->getManager('oracle');
}

Имейте в виду, что это синхронные операции, и ваше приложение будет работать медленнее. Я предлагаю вам изучить репликацию mysql/oracle для ваших целей, возможно, что-то вроде этого.

UPD Как упомянул Cerad, этот подход не решит проблему, потому что требует отдельных сущностей для каждого менеджера.

person Snegirekk    schedule 05.01.2021
comment
Просто имейте в виду, что ваш подход не будет работать с Symfony «из коробки». Менеджер нескольких сущностей Symfony серьезно сломался при попытке использовать одну и ту же сущность в нескольких менеджерах. - person Cerad; 05.01.2021
comment
репликация была первым подходом, но должна быть возможность изменить модель базы данных приложения без изменения сценариев репликации каждый раз. Цель состоит в том, чтобы сохранить mysql в качестве производительной рабочей базы данных и иметь копию всех данных, доступных в оракуле, для расширенных отчетов с использованием разных таблиц оракула. ‹br› Таким образом, с двумя менеджерами сущностей можно было бы писать в обе базы данных без дублирования вызовов в коде для каждого сохраняющегося запроса? - person Nekudotayim; 05.01.2021
comment
@Cerad, ты прав, этот подход требует дублирования сущностей для каждого менеджера, мой плохой. - person Snegirekk; 06.01.2021