我正在开发一个Codeigniter (2.0.2)应用程序,它将使用主数据库进行所有写操作(插入/更新/删除),并将读副本用于所有读操作(选择)。
现在我知道我可以在代码中访问两个不同的数据库对象,以将单个请求路由到特定的数据库服务器,但我认为有一种更好的方法,自动化的方法。我将使用MySQL和Active Record,还想内置Memcache检查-尽管不会立即使用它,但我希望在未来使用该选项,在此阶段内置。
我在想是否有可能添加某种钩子/库来拦截$this->db->查询,这样就会发生以下情况:
1)收到SQL查询
2)检查是否选择查询
2a)如果选择,则查看Memcache是否处于活动状态,如果是,则编码SQL并检查Memcache是否响应。
2b)如果没有memcache响应,或者Memcache未激活,则通过READ MySQL服务器正常执行查询。
3)查询没有select,所以通过写MySQL服务器正常执行查询。
4)返回响应。
我确信,从这个角度来看,这应该是相当简单的,但无论我怎么看,我都没有看到一个潜在的答案--但肯定有一个!任何人都可以帮助/协助吗?
此外,我还希望能够记录所有写SQL命令的故障排除,大概最好的方式是介绍3a)写SQL命令到纯文本文件…添加到上述方案中。我不相信MySQL真的记录了非SELECT查询...是吗?
发布于 2011-07-19 21:58:22
这种类型的行为有点超出了CI的正常范围。不幸的是,最好的办法是手动extend the database drivers,特别是覆盖函数simple_query或_execute (simple_query是_execute的包装器,它只是确保初始化)。这是唯一可以保证捕获所有查询并相应地对逻辑进行分支的地方。(您可能还希望覆盖close,因为这是清理脚本)
(就我个人而言,我会让SELECT DB将辅助数据库加载到它自己中,并有条件地调用$write_ DB ->simple_query,这似乎是最小的麻烦)。
https://stackoverflow.com/questions/6748190
复制相似问题