2014-11-17 2 views
2

Я написал класс данных для обработки запросов MySQL, а затем все остальные классы, такие как login, products, расширяют этот класс, чтобы использовать базу данных. В результате, при каждой загрузке страницы создает 2 или более DB соединения в связи с чем-то подобного следующим:Должен ли базовый класс базы PHP PHP создавать несколько соединений?

$login, parent::__construct(); // check login via db 
$products, parent::__construct(); // fetch products from db 

Есть ли способ обойти эту проблему, такие как добавление некоторого кода в конструкторе, чтобы проверить, имеет ли существующее соединение DB уже созданы?

Совместимый разработчик Я работаю с написанием в процедурном стиле и просто использует один глобальный $_db object для всех запросов, и это кажется намного более эффективным, поскольку он создает только одно соединение с БД.

+1

Вы должны использовать 'DI' и передать экземпляр вашего класса' DB' ваших 'классов Factory'. Таким образом, U имеет только одно открытое соединение на одного клиента. – DarkBee

+0

. Вы можете установить свой '$ _db_object' как статичный внутри вашего класса (' private static $ _db_object'), а в __construct() проверить, является ли 'self :: $ _ db_object' если он не подключен. – Naomi

+0

Нет, вы хотите, чтобы ваши приложения открывали только одно подключение к базе данных, несколько соединений создадут нежелательные накладные расходы в приложении. @Naomi static - один из способов, но предпочтительнее использовать инъекцию зависимости, ваша абстракция должна быть отключена от соединения, и вы передаете соединение в модель. –

ответ

3

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

Для чего-то большего, я обычно использую свою БД из ORM, так что это становится проблемой.

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