2012-04-11 2 views
2

Der DBA in meiner Firma verfügt über ein Skript, das lang laufende Datenbankverbindungen und Abfragen in unseren Produktionsdatenbanken automatisch beendet. Ich habe eine CakePHP-Shell-Anwendung geschrieben, die in einer Schleife läuft, quasi wie ein Daemon, der periodisch Lese- und Schreibvorgänge in der Datenbank ausführen muss. Wenn es zu lange läuft, wird die Datenbankverbindung durch das Wartungsskript geschlossen und meine App-Fehler werden beseitigt.Verhindern, dass sich CakePHP automatisch mit der Datenbank verbindet, wenn das Modell instanziiert wird

Betrachtet man die CakePHP-Quelle, so scheint es, als ob bei der Instanziierung eines Modells automatisch versucht wird, sich mit der entsprechenden Datenbank zu verbinden. Gibt es eine Möglichkeit, nur bei einer Abfrage eine Verbindung zur Datenbank herzustellen, und dann die Verbindung trennen?

+0

Ich glaube nicht, dass es eine saubere Art und Weise ist, dies zu tun, ohne den Kern zu berühren, ich würde darüber nachdenken und vielleicht eine Antwort am Morgen geben. Aber IMHO, dass DBA-Politik macht keinen Sinn, wissen Sie, warum sie es tun? – luchomolina

+1

Obwohl es einen sauberen Weg geben könnte, um das zu erreichen, was du in CakePHP machen willst, muss ich @luchomolina zustimmen, da stimmt etwas nicht. Es ist entweder die Richtlinie, oder es ist die Tatsache, dass Ihre Shell ständig läuft. Ist es nicht möglich, Ihr Shell-Skript regelmäßig auszuführen (als Cron-Job?). Ich weiß, dass dieser Kommentar Ihr Problem nicht löst (weshalb ich versucht habe, unten eine nützliche Antwort zu geben), aber es ist etwas, worüber Sie nachdenken sollten. – Joep

Antwort

4

Vielleicht können Sie manuell verbinden/trennen, wenn Sie müssen?

DboSource bietet viele Methoden zum Spielen. Hier ist eine Liste von Funktionen, die nützlich sein können:

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

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

Weitere Methoden in der DboSource API docs

+0

Das habe ich getan. Siehe eine ähnliche Frage und Antwort hier: http://stackoverflow.com/questions/5118519/cakephp-reconnect-to-db – ThisSuitIsBlackNot

2
aufgeführt sind

Vielleicht könnten Sie die Rückrufe in der AppModel für diese.

Ich würde vermuten, dass Sie beforeFind und beforeSafe, um eine Verbindung zur Datenbank verwenden könnten und dann verwenden afterFind und afterSafe Ihre Verbindung zu töten.

Wie für eine "richtige" Art und Weise zum Öffnen und Schließen von Datenbankverbindungen mit Core Cake-Funktionalität, bin ich mir nicht sicher, aber Costa Antwort scheint wie ein guter (und sauber!) Plan.

(1) http://book.cakephp.org/1.3/en/view/922/Database-Configuration (Verbindung aufgehört zu arbeiten, erraten Sie jetzt hier aussehen: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html)

+0

Ich habe nicht über Callbacks nachgedacht. Am Ende nutze ich Costas Vorschlag und es funktioniert gut genug, aber Callbacks könnten sauberer sein als das manuelle Aufrufen von connect/disconnect, wenn ich eine Funktion anrufe, die möglicherweise für eine lange Zeit blockiert. – ThisSuitIsBlackNot

+0

Ihr angegebener Link funktioniert nicht – Sadikhasan

+1

Ja, wahrscheinlich, weil meine Antwort fast drei Jahre alt ist und die CakePHP-Website in der Zwischenzeit ihre Linkstruktur geändert hat. Das ist aber nicht wirklich konstruktiv (plus: Sie hätten nach der aktuellen Adresse suchen und den Beitrag selbst aktualisieren können ...) – Joep

Verwandte Themen