Seperti yang Anda katakan, MySQlProxy bisa menjadi solusi, tetapi saya pribadi tidak pernah mengujinya dalam produksi.
Saya menggunakan koneksi 2 Db dalam kode saya untuk memisahkan permintaan menulis dan membaca. 80% dari tugas biasa dilakukan dengan koneksi baca. Anda dapat menggunakan Zend_Application_Resource_Multidb untuk mengatasinya (Bagi saya, saya telah melakukan bagian ini jauh sebelumnya dan saya hanya menyimpan koneksi Db kedua di registri).
- Pertama batasi hak pengguna Anda hanya pada operasi membaca dan buat dbuser lain dengan otorisasi tulis.
- lalu lacak setiap permintaan tulis dalam kode Anda ("perbarui", "masukkan", "hapus" adalah awal yang baik) dan coba lakukan semua panggilan ini dengan bantuan khusus.
- jalankan aplikasi Anda dan lihat aplikasinya mogok, lalu perbaiki masalahnya :-)
Lebih mudah ketika Anda memikirkan masalah ini di awal. Misalnya:
- Saya biasanya memiliki pabrik Zend_Db_Table, mengambil parameter 'read' atau 'write', dan memberi saya Singleton dari Zend_Db_Table yang tepat (singleton ganda, jika saya dapat memiliki instance baca dan instance tulis). Maka saya hanya perlu memastikan saya menggunakan Zend_Db_Table yang diinisialisasi dengan benar ketika saya menggunakan kueri/operasi akses tulis. Perhatikan bahwa penggunaan memori jauh lebih baik saat menggunakan Zend_Db_Table sebagai lajang.
- Saya mencoba untuk mendapatkan semua operasi tulis di TransactionHandler. Saya di sana saya dapat memeriksa saya hanya menggunakan objek yang terhubung dengan koneksi yang benar. Transaksi kemudian dikelola pada pengontrol, saya tidak pernah mencoba mengelola transaksi di lapisan Database, semua pemikiran mulai/komit/kembalikan dilakukan pada pengontrol (atau lapisan konseptual lain, tetapi bukan lapisan DAO).
Poin terakhir ini, transaksi, penting. Jika Anda ingin mengelola transaksi, penting untuk membuat permintaan BACA DI DALAM transaksi , dengan koneksi berkemampuan MENULIS . Karena semua pembacaan yang dilakukan sebelum transaksi harus dianggap usang, dan jika backend database Anda melakukan penguncian implisit, Anda harus membuat permintaan baca untuk mendapatkan penguncian. Jika backend database Anda tidak melakukan pembacaan implisit maka Anda juga harus melakukan kunci baris dalam transaksi. Dan itu berarti Anda tidak boleh mengandalkan kata kunci SELECT untuk mendorong permintaan itu pada koneksi hanya-baca.
Jika Anda memiliki penggunaan lapisan db yang bagus di aplikasi Anda, perubahannya tidak terlalu sulit dilakukan. Jika Anda membuat kekacauan dengan database/layer DAO Anda, maka... mungkin akan lebih sulit.