Như bạn đã nói MySQlProxy có thể là một giải pháp, nhưng tôi phân tích chưa bao giờ thử nghiệm nó trong sản xuất.
Tôi sử dụng 2 kết nối Db trong mã của mình để tách ra các yêu cầu ghi và đọc. 80% tác vụ thông thường được thực hiện với kết nối đọc. Bạn có thể sử dụng Zend_Application_Resource_Multidb để xử lý điều đó (Đối với tôi, tôi đã làm phần này từ lâu và tôi chỉ đơn giản là lưu trữ kết nối Db thứ hai trong sổ đăng ký).
- Trước tiên, hãy giới hạn quyền người dùng của bạn chỉ đối với hoạt động đang đọc và tạo một trình dbuser khác với quyền ghi.
- sau đó theo dõi mọi yêu cầu viết trong mã của bạn ("cập nhật", "chèn", "xóa" là một khởi đầu tốt) và cố gắng thực hiện tất cả các lệnh gọi này bằng một trình trợ giúp chuyên dụng.
- chạy ứng dụng của bạn và xem nó gặp sự cố, sau đó khắc phục sự cố :-)
Sẽ dễ dàng hơn khi bạn nghĩ đến vấn đề này trong đầu. Ví dụ:
- Tôi thường có một nhà máy Zend_Db_Table, lấy tham số 'đọc' hoặc 'ghi' và cung cấp cho tôi một Singleton của đúng Zend_Db_Table (một singleton kép, tôi có thể có một cá thể đọc và một cá thể ghi). Sau đó, tôi chỉ cần đảm bảo rằng tôi sử dụng đúng Zend_Db_Table được khởi tạo khi tôi sử dụng truy vấn / hoạt động truy cập ghi. Lưu ý rằng việc sử dụng bộ nhớ tốt hơn nhiều khi sử dụng Zend_Db_Table làm các đĩa đơn.
- Tôi cố gắng nhận tất cả các thao tác ghi trong một TransactionHandler. Tôi ở đó, tôi có thể kiểm tra Tôi chỉ sử dụng các đối tượng được liên kết với kết nối phù hợp. Sau đó, các giao dịch được quản lý trên bộ điều khiển, tôi không bao giờ cố gắng quản lý giao dịch trong các lớp Cơ sở dữ liệu, tất cả suy nghĩ bắt đầu / cam kết / khôi phục được thực hiện trên bộ điều khiển (hoặc một lớp khái niệm khác, nhưng không phải lớp DAO).
Điểm cuối cùng này, giao dịch, là quan trọng. Nếu bạn muốn quản lý giao dịch, điều quan trọng là phải thực hiện yêu cầu ĐỌC BÊN TRONG giao dịch , với kết nối hỗ trợ WRITE . Vì tất cả các lần đọc được thực hiện trước khi giao dịch sẽ được coi là lỗi thời và nếu chương trình phụ trợ cơ sở dữ liệu của bạn đang hoạt động dẫn đến các khóa, bạn sẽ phải thực hiện yêu cầu đọc để nhận các khóa. Nếu chương trình phụ trợ cơ sở dữ liệu của bạn không thực hiện đọc ngầm thì bạn cũng sẽ phải thực hiện các khóa hàng trong giao dịch. Và điều đó có nghĩa là bạn không nên dựa vào từ khóa CHỌN để đẩy yêu cầu đó lên kết nối chỉ đọc.
Nếu bạn có cách sử dụng lớp db tốt trong ứng dụng của mình thì thay đổi không thực sự khó thực hiện. Nếu bạn đã tạo ra những thứ hỗn loạn với cơ sở dữ liệu / lớp DAO của mình thì ... nó có thể khó hơn.