在 CakePHP 中调用 SaveAll 时同时写入 2 个数据源

发布于 2024-11-13 07:02:02 字数 721 浏览 3 评论 0原文

当调用 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. 使用两者的组合。在保存之前检查一致性,并每天进行一次脚本复制

哪种方法是最好的方法,或者是否有更好的方法来实现此要求?有什么方法可以保证一致性吗?

I am trying to write values to 2 databases (need not be simultaneously) when the saveAll function is called. This does not apply to all tables but only 4 out of the 10 tables in the 2 databases.

My current logic, in Pseudocode:

    $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;

The issue with this is that sometimes it does not write to the second source, resulting in inconsistencies.

I need some advice on how to best solve this issue. I have 3 possible ideas:

  1. Follow the code above and add checks to make sure things get saved and if it doest, rollback the default to maintain consistency
  2. Write a server script that does a replication every time a saveAll() is called. (Resource intensive and not really scalable)
  3. Use a combo of both. Do a check for consistency before saving and do a script replication once a day

Which is the best way or are there better ways of implementing this requirement? Any ways to ensure consistencies?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

呢古 2024-11-20 07:02:02

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

另外,你将如何扩展这个规模?

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

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

祝你好运!

The solution possibly lies in database table replication (set up your second database as a slave, configured to replicate only specific tables).

Also, how will you ever scale this?

This way, you only need to worry about writing to the DB once (your models are going to get very bloated if you need all this extra code to write to two every time), plus you are allowing your app to scale horizontally in the future (think if your app was so big you required 20 x database servers?).

Another solution would be to create a shell task, scheduled on a cron job to move the data, but I would consider replication first.

Good luck!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文