0

私はCodeigniter(2.0.2)アプリケーションを開発しています。このアプリケーションは、すべての書き込み操作(INSERT / UPDATE / DELETE)にマスターデータベースを利用し、すべての読み取り操作(SELECT)にリードレプリカを利用します。

これで、コード内の2つの異なるデータベースオブジェクトにアクセスして、個々のリクエストを特定のデータベースサーバーにルーティングできることがわかりましたが、より良い方法、自動化された方法があると思います。MySQLとActiveRecordを使用し、Memcacheチェックも組み込みたいと思います。すぐには使用されませんが、この段階で組み込まれる将来のオプションが必要です。

$ this-> db-> queryをインターセプトするために、ある種のフック/ライブラリを追加して、次のようにすることが可能かどうかを考えています。

1)受信したSQLクエリ

2)SELECTクエリかどうかを確認します

2a)SELECTの場合は、Memcacheがアクティブかどうかを確認します。アクティブな場合は、SQLをエンコードし、Memcacheの応答を確認します。

2b)memcache応答がない場合、またはMemcacheがアクティブでない場合は、READMySQLサーバーを介して通常どおりクエリを実行します。

3)クエリが選択されなかったため、WRITEMySQLサーバーを介して通常どおりクエリを実行します。

4)応答を返します。

これを見ると、それは非常に簡単なはずですが、どのように見ても、潜在的な答えは見当たらないだけです。しかし、答えは1つでなければなりません。誰かが助け/支援できますか?

さらに、トラブルシューティングのためにすべてのSQL書き込みコマンドをログに記録できるようにする機能も必要です。おそらく最善の方法は、3a)SQLコマンドをプレーンテキストファイルに書き込む...上記のスキームに導入することです。とにかく、MySQLが実際に非SELECTクエリをログに記録するとは思わない...そうですか?

4

1 に答える 1

1

この種の動作は、CIの通常の範囲を少し超えています。残念ながら、最善の策は、データベースドライバーを手動で拡張することです。具体的には、関数をオーバーライドするか、simple_queryまたは_execute(simple_queryは_executeのラッパーであり、初期化を確実にするだけです)。これは、すべてのクエリをキャッチし、それに応じてロジックを分岐できることを保証できる唯一の場所です。close(クリーンアップスクリプトであるため、オーバーライドすることもできます)

(個人的には、SELECT DBにセカンダリDBをロードさせ、条件付きで$ write_db-> simple_queryを呼び出すだけで、問題が最も少ないように見えます)。

于 2011-07-19T13:58:22.497 に答える