如何在CakePHP中管理AWS Aurora主机端点的读写?
我正在使用一个基于CakePHP的API,它利用AWS Aurora来管理我们的MySQL数据库。CakePHP应用程序有许多大型的读取查询,需要单独的查询以避免耗尽数据库资源 其工作方式是,当您将CakePHP连接到主机字段时,AWS为您提供单独的端点以在主机字段中使用 我继续按照下面的方式对其进行配置,这是可行的。以下数据源在config/app.php中设置,使用主机值的读卡器和集群(默认)端点:如何在CakePHP中管理AWS Aurora主机端点的读写?,php,amazon-web-services,cakephp,cakephp-3.0,amazon-aurora,Php,Amazon Web Services,Cakephp,Cakephp 3.0,Amazon Aurora,我正在使用一个基于CakePHP的API,它利用AWS Aurora来管理我们的MySQL数据库。CakePHP应用程序有许多大型的读取查询,需要单独的查询以避免耗尽数据库资源 其工作方式是,当您将CakePHP连接到主机字段时,AWS为您提供单独的端点以在主机字段中使用 我继续按照下面的方式对其进行配置,这是可行的。以下数据源在config/app.php中设置,使用主机值的读卡器和集群(默认)端点: <?php // Other data-source and app setting
<?php
// Other data-source and app settings are omitted, to keep things simple
return [
'Datasources' => [
'default' => [
'host' => 'mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com',
],
'read' => [
'host' => 'mydbcluster.cluster-ro-123456789012.us-east-1.rds.amazonaws.com',
],
]
];
这个话题偶尔会出现,但结论始终是这不是核心想要支持的东西:
因此,您需要自己解决这个问题,有很多方法可以以更简单的方式解决这个问题,但这在很大程度上取决于应用程序的特定需求。在这方面很难给出任何适当的一般性建议,因为做错事情可能会带来可怕的后果
比如,如果您盲目地将特定连接应用于所有读取操作,那么当您在基于读取数据写入内容的事务中时,应用程序将在另一个连接上发出读取时,您很可能会非常伤心
令人遗憾的是,您可以将模型拆分为读/写模型,沿着CQRS-ish路线,您可以使用为表提供更直观和可重用API的行为,您可以将操作移动到模型层,并以这种方式隐藏可能有点脏的实现,您可以根据请求的端点配置默认连接,例如是读连接还是写连接,等等
有很多方法可以“解决”这个问题,但我恐怕这里的任何人都不能肯定地回答这个问题
<?php
/**
* Class TaskNotesController
*
* @property \App\Model\Table\TaskNotesTable $TaskNotes
*/
class TaskNotesController extends \Cake\Controller\Controller
{
public function index(): void
{
$taskNotes = $this->TaskNotes
->setConnection(\Cake\Datasource\ConnectionManager::get('read'))
->find('all')
->where(['foo' => 'bar']);
}
}