2014-11-09 2 views
2

Doctrine инкапсулирует собственный, связанный с драйвером ресурс управления подключением к базе данных внутри его классов Connection. Я говорю о ресурсе, возвращенном, например, mysqli_connect(). Я не вижу доступа к ресурсу необработанных соединений - нет методов getter, которые я смог найти. Эта сильная инкапсуляция, вероятно, должна быть подсказкой, что я не должен пытаться получить к ней доступ и использовать ее, но, конечно, это именно то, что я хочу сделать.Повторное использование соединения с базой данных, используемое диспетчером сущности доктрины

Не могли бы вы вызвать какие-либо проблемы, если бы я мог отправлять запросы на чтение только с одного и того же соединения? Я не уверен, как работает поток доктрины под капотом. Соединения с базой данных являются работоспособными, и я немного испугался, что могу вскочить и выпустить SQL-запрос в тот момент, когда у доктрины есть несколько многоступенчатых транзакций, которые частично выполняются, и это, очевидно, вызовет проблему. Но с однопоточной природой php я думаю, что есть приличный шанс, что это может быть невозможно на практике, в зависимости от того, как работает доктрина.

Помимо этого, причина, по которой я хочу сделать это, - это производительность. У меня есть другой код, который не написан с помощью доктрины, и он хочет иметь необработанное соединение с базой данных, потому что он использует собственные функции расширения db. Я мог бы просто открыть другое соединение db, но открытие второго соединения имеет значительные последствия для производительности в моем сценарии ... что делает его очень привлекательным, чтобы попытаться повторно использовать соединение доктрин.

+0

доктрина предназначена для абстрагирования базового соединения с базой данных. зачем вы хотите это использовать? просто создайте необработанное соединение – Aris

+0

@Aris Вы прочитали последнюю часть сообщения? Я объяснил, почему. – goat

ответ

2

Попробуйте getWrappedConnection возвращает экземпляр Doctrine\DBAL\Driver\PDOConnection, который является оболочкой для \PDO:

$connection = $this->getEntityManager() 
    ->getConnection() 
    ->getWrappedConnection(); 

$stmt = $connection->prepare('SELECT * FROM `City`'); 
$stmt->execute(); 

P.S. Я считаю, что совершенно нормально использовать существующее соединение вместо создания нового. Я делаю это в проекте с Doctrine1 и Doctrine2.

+0

Я собираюсь принять этот ответ не потому, что он напрямую отвечает на мой вопрос, но из-за того, что публичный метод 'getWrappedConnection()' на практике возвращает реализации, которые более или менее напрямую используют реальный ресурс соединения, не выполняя проверку соединения/состояние транзакции. Это для меня, это говорит о том, что разработчики не чувствуют, что такая вещь необходима. Таким образом, представляется безопасным повторное использование необработанного соединения. – goat

Смежные вопросы