0

我正在开发一个 Codeigniter (2.0.2) 应用程序,它将利用 Master 数据库进行所有写操作(INSERT/UPDATE/DELETE)和一个只读副本用于所有读操作(SELECT)。

现在我知道我可以在代码中访问两个不同的数据库对象以将各个请求路由到特定的数据库服务器,但我认为有更好的方法,自动化的方法。我将使用 MySQL 和 Active Record,并且还想构建 Memcache 检查 - 虽然它不会立即使用,但我希望将来可以选择在这个阶段内置。

我在想是否可以添加某种钩子/库来拦截 $this->db->query 以便发生以下情况:

1) 收到 SQL 查询

2)检查是否选择查询

2a) 如果 SELECT,查看 Memcache 是否处于活动状态,如果是,则编码 SQL 并检查 Memcache 以获取响应。

2b) 如果没有 memcache 响应,或者 Memcache 未处于活动状态,则通过 READ MySQL 服务器正常执行查询。

3) 查询未被选择,因此通过 WRITE MySQL 服务器正常执行查询。

4) 返回响应。

我敢肯定,看着这个,它应该很简单,但无论我怎么看,我只是没有看到潜在的答案 - 但必须有一个!任何人都可以提供帮助/协助吗?

另外,我还希望能够记录所有写SQL命令进行故障排除,想必最好的办法是把3a) Write SQL command to plain text file...引入到上面的方案中。我不相信 MySQL 实际上会记录非 SELECT 查询……是吗?

4

1 回答 1

1

这种行为有点超出 CI 的正常范围。不幸的是,最好的办法是手动扩展数据库驱动程序,特别是覆盖函数simple_query_execute(simple_query 是 _execute 的包装器,它只是确保初始化)。那确实是唯一可以保证您可以捕获所有查询并相应地分支逻辑的地方。(您可能还想覆盖close,因为那是清理脚本)

(就个人而言,我会让 SELECT DB 将辅助数据库加载到自身中,然后有条件地调用 $write_db->simple_query,这似乎是最不麻烦的)。

于 2011-07-19T13:58:22.497 回答