Вопрос по – Запретить автоматическое подключение CakePHP к базе данных при создании экземпляра модели

2

Администратор базы данных в моей компании имеет скрипт, который автоматически убивает длительные соединения с базами данных и запросы к нашим производственным базам данных. Я написал приложение CakePHP Shell, которое запускается в цикле, вроде демона, которому периодически нужно выполнять чтение и запись в базу данных. Если он работает слишком долго, соединение с базой данных закрывается сценарием обслуживания, и мое приложение выходит из строя.

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

Я не думаю, что есть чистый способ сделать это, не касаясь сути, я подумаю об этом и, возможно, предоставлю ответ утром. Но ИМХО, что политика DBA не имеет смысла, вы знаете, почему они это делают? luchomolina
Хотя в CakePHP может быть чистый способ добиться того, что вы хотите сделать, я должен согласиться с @luchomolina, но здесь что-то не так. Это либо политика, либо факт, что ваша оболочка работает постоянно. Разве нельзя периодически запускать сценарий оболочки (как задание cron?). Я знаю, что этот комментарий не решает вашу проблему (именно поэтому я постарался дать полезный ответ ниже), но об этом стоит подумать. Joep

Ваш Ответ

2   ответа
4

У DboSource есть много способов играть с вами. Вот список функций, которые могут быть полезны:

$db = ConnectionManager::getDataSource('local');

$isconnected = $db->isConnected();  //is the connection open?
$db->close();  //close the connection
$db->reconnect();  //reconnect to the db

Дополнительные методы перечислены вDboSource API документы

Это то, что я в итоге сделал. Смотрите аналогичный вопрос и ответ здесь:stackoverflow.com/questions/5118519/cakephp-reconnect-to-db ThisSuitIsBlackNot
2

вы могли бы использовать обратные вызовы в AppModel для этого.

Я полагаю, что вы могли бы использоватьbeforeFind а такжеbeforeSafe установить соединение с базой данных, а затем использоватьafterFind а такжеafterSafe чтобы убить вашу связь.

Что касается «правильного» способ открытия и закрытия соединений с базой данных с использованием основной функциональности Cake, я не уверен, но ответ Коста кажется хорошим (и чистым!) планом.

(1) http://book.cakephp.org/1.3/en/view/922/Database-Configuration (Ссылка перестала работать, думаю, вы должны посмотреть здесь и сейчас:http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html )

Да, это возможно потому, что моему ответу почти три года, и сайт тем временем изменил свою структуру ссылок. Хотя это не очень конструктивно (плюс: вы могли бы найти текущий адрес и обновить сообщение самостоятельно ...)
Я не думал об использовании обратных вызовов. В итоге я воспользовался предложением Косты, и оно работает достаточно хорошо, но обратные вызовы могут быть чище, чем ручной вызов подключения / отключения, каждый раз, когда я вызываю функцию, которая может блокироваться в течение длительного времени. ThisSuitIsBlackNot
Ваша ссылка не работает

Похожие вопросы