我正在开发一个Codeigniter(2.0.2)应用程序,该应用程序将利用Master数据库进行所有写入操作(INSERT / UPDATE / DELETE)和所有读取操作的读取副本(SELECT)。
现在我知道我可以访问代码中的两个不同的数据库对象来将各个请求路由到特定的数据库服务器,但我认为有更好的方法,自动化方式。我将使用MySQL和Active Record,并且还希望构建Memcache检查 - 虽然它不会立即使用,但我希望将来可以选择,在此阶段内置。
我在想是否可以添加某种钩子/库来拦截$ this-> db->查询,以便发生以下情况:
1)收到SQL查询
2)检查SELECT查询
2a)如果是SELECT,请查看Memcache是否处于活动状态,如果是,则编码SQL并检查Memcache是否有响应。
2b)如果没有memcache响应或Memcache未激活,则通过READ MySQL服务器正常执行查询。
3)查询未被选中,因此通过WRITE MySQL服务器正常执行查询。
4)回复。
我确信看到这个,它应该很简单,但不管我怎么看,我只是没有看到一个潜在的答案 - 但必须有一个!有人可以帮助/协助吗?
另外,我还希望能够记录所有写入SQL命令以进行故障排除,大概最好的方法是引入3a)将SQL命令写入纯文本文件...进入上述方案。我不相信MySQL实际上会记录非SELECT查询...是吗?
答案 0 :(得分:1)
这种行为有点超出CI的正常范围。不幸的是,你最好的选择是手动extend the database drivers,特别是覆盖函数simple_query
或_execute
(simple_query是_execute的包装器,它只是确保初始化)。这是唯一可以保证您可以捕获所有查询并相应地分支逻辑的地方。 (您可能还想覆盖close
,因为那是清理脚本)
(就个人而言,我会让SELECT DB将辅助数据库加载到自身中,只是有条件地调用$ write_db-> simple_query,这似乎是最不麻烦的事情。)