Эта проблема была поднята с использованием Laravel 5.0.
Настройка базы данных моего проекта состоит из 1 узла записи и нескольких реплик чтения (postgresql). Каждый раз, когда соединение инициируется для любого запроса, например:
php
<?php $user = \App\User::find(1); ?>
… установлено соединение с узлом записи. Это происходит даже тогда, когда не выполняются запросы на запись (включая set names 'utf8'
, так далее); соединение будет установлено, но все SELECT
запросы корректно выполняются на репликах чтения.
Как я могу избежать этого подключения записи, если мне не нужно / использовать его для запросов только для чтения?
Есть два класса, поддерживающие соединения с БД: Illuminate/Database/DatabaseManager
а также Illuminate/Database/Connectors/ConnectionFactory
,
Когда какой-либо класс Laravel хочет использовать соединение с БД, он вызывает DatabaseManager::connection()
которые в конечном итоге запрашивают фактическое соединение через ConnectionFactory::make()
,
Ваша проблема лежит здесь, в основе make()
Процесс создает и «чтение» и «запись» соединения одновременно. Таким образом, соединение «запись» всегда установлено. Это поведение ConnectionFactory
,
Таким образом, лучший способ — открыть вопрос о Laravel, спросив команду разработчиков, хотят ли они улучшить установление соединения только тогда, когда оно действительно необходимо.
Отредактировано:
Я только что обнаружил, что вы уже открыли вопрос 🙂
Других решений пока нет …