2012-04-11 4 views
2

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

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

+0

Я не думаю, что есть чистый способ сделать это, не касаясь ядра, я буду думать об этом и может быть, дать ответ утром. Но IMHO, что политика DBA не имеет смысла, знаете ли вы, почему они это делают? – luchomolina

+1

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

ответ

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 docs

+0

Вот что я в итоге сделал. См. Аналогичный вопрос и ответ здесь: http://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)

+0

Я не думал об использовании обратных вызовов. Я закончил использовать предложение Costa, и он работает достаточно хорошо, но обратные вызовы могут быть более чистыми, чем ручное вызов connect/disconnect каждый раз, когда я вызываю функцию, которая может блокироваться в течение длительного времени. – ThisSuitIsBlackNot

+0

Ваша ссылка не работает – Sadikhasan

+1

Да, это, вероятно, потому, что мой ответ почти три года, и сайт cakephp изменил свою структуру ссылок тем временем. Это не очень конструктивно (плюс: вы могли бы искать текущий адрес и обновлять сообщение самостоятельно ...) – Joep

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