【问题标题】:Prevent CakePHP from automatically connecting to database when instantiating model防止 CakePHP 在实例化模型时自动连接数据库
【发布时间】:2012-04-11 01:47:59
【问题描述】:

我公司的 DBA 有一个脚本,可以自动终止对我们生产数据库的长时间运行的数据库连接和查询。我编写了一个循环运行的 CakePHP Shell 应用程序,有点像一个守护进程,它需要定期进行数据库读取和写入。如果运行时间过长,数据库连接会被维护脚本关闭,并且我的应用程序会出错。

查看 CakePHP 源代码,似乎在实例化模型时,它会自动尝试连接到适当的数据库。有没有办法只在查询时连接数据库,然后断开连接?

【问题讨论】:

  • 我认为没有一种干净的方法可以做到这一点而不触及核心,我会考虑一下,也许会在早上提供答案。但是恕我直言,DBA 政策没有意义,你知道他们为什么这样做吗?
  • 虽然在 CakePHP 中可能有一种干净的方式来实现您想要做的事情,但我必须同意@luchomolina,但有些地方不对劲。这要么是策略,要么是你的 shell 不断运行的事实。是否可以定期运行您的 shell 脚本(作为 cron 作业?)。我知道这个评论不能解决你的问题(这就是为什么我试图在下面给出一个有用的答案),但这是值得考虑的事情。

标签: cakephp


【解决方案1】:

也许您可以在需要时手动连接/断开连接?

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

【讨论】:

【解决方案2】:

也许您可以为此使用 AppModel 中的回调。

我猜你可以使用beforeFindbeforeSafe 来建立与数据库的连接,然后使用afterFindafterSafe 来终止你的连接。

至于使用核心 Cake 功能打开和关闭数据库连接的“正确”方式,我不确定,但 Costa 的回答似乎是一个好的(而且干净!)计划。

(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

【讨论】:

  • 我没有考虑过使用回调。我最终使用了 Costa 的建议,并且效果很好,但是每次调用可能会阻塞很长时间的函数时,回调可能比手动调用 connect/disconnect 更干净。
猜你喜欢
  • 2021-10-13
  • 2017-12-10
  • 2015-11-06
  • 2021-09-19
  • 2023-03-09
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多