【问题标题】:Write to 2 datasources simultaneously when calling SaveAll in CakePHP在 CakePHP 中调用 SaveAll 时同时写入 2 个数据源
【发布时间】:2011-06-03 03:15:56
【问题描述】:

当调用 saveAll 函数时,我正在尝试将值写入 2 个数据库(不必同时)。这不适用于所有表,但仅适用于 2 个数据库中 10 个表中的 4 个。

我目前的逻辑,在伪代码中:

    $updateOk = $model->saveAll(...);

    if (!$updateOk)
      return error;

    /* start second source synchronizing */
    $model->changeDataSource('second');
    $updateOk = $model->saveAll(...);

    $model->changeDataSource('default');
    if (!$updateOk)
        return error;

    return;

这样做的问题是有时它不会写入第二个源,从而导致不一致。

我需要一些关于如何最好地解决此问题的建议。我有 3 个可能的想法:

  1. 按照上面的代码并添加检查以确保保存内容,如果保存,则回滚默认值以保持一致性
  2. 编写一个每次调用 saveAll() 时执行复制的服务器脚本。 (资源密集型且无法真正扩展)
  3. 结合使用两者。在保存之前检查一致性并每天进行一次脚本复制

实现此要求的最佳方式或有更好的方式吗?有什么方法可以确保一致性?

【问题讨论】:

  • 另一个想法可能是使用beforeSave 和/或afterSave 将数据保存到另一个数据源。只是一个想法。
  • 是的,我打算改写 saveAll 函数。并添加检查我要复制的表是否进行切换并进行提交。这样,在控制器中工作的编码器就不必知道模型的复杂性。

标签: mysql cakephp datasource database-replication


【解决方案1】:

解决方案可能在于数据库表复制(将您的第二个数据库设置为从属,配置为仅复制特定表)。

另外,你将如何扩展它?

这样,您只需要担心写入数据库一次(如果您需要所有这些额外的代码每次都写入两个,您的模型会变得非常臃肿),而且您允许您的应用水平扩展将来(想想如果您的应用程序如此之大以至于需要 20 台数据库服务器?)。

另一种解决方案是创建一个 shell 任务,安排在一个 cron 作业上以移动数据,但我会首先考虑复制。

祝你好运!

【讨论】:

  • 没错。我最终只为特定表设置了数据库复制(意识到这是可能的)。唯一的问题是,显然他们倾向于出去同步。所以需要设置某种监控。为此,我最终可能会使用 cron 作业进行差异检查或使用 maatkit 等工具。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多