2010-07-19 35 views
8

Cảm ơn bạn đã đọc nội dung này.Mùa xuân: nguồn dữ liệu riêng biệt cho các giao dịch chỉ đọc

Tôi có 2 cơ sở dữ liệu MySQL - làm chủ để viết, nô lệ cho lần đọc. Kịch bản hoàn hảo tôi tưởng tượng là ứng dụng của tôi sử dụng kết nối để làm chủ các giao dịch readOnly=false, phụ thuộc vào giao dịch readOnly=true.

Để thực hiện điều này, tôi cần phải cung cấp kết nối hợp lệ tùy thuộc vào loại giao dịch hiện tại. Lớp dịch vụ dữ liệu của tôi không nên biết loại kết nối mà nó sử dụng và chỉ sử dụng trực tiếp SqlMapClient (tôi sử dụng iBatis). Điều này có nghĩa là (nếu tôi hiểu đúng), SqlMapClient s được tiêm phải được ủy quyền và đại biểu phải được chọn khi chạy.

public class MyDataService { 

    private SqlMapClient sqlMap; 

    @Autowired 
    public MyDataService (SqlMapClient sqlMap) { 
     this.sqlMap = sqlMap; 
    } 

    @Transactional(readOnly = true) 
    public MyData getSomeData() { 
     // an instance of sqlMap connected to slave should be used 
    } 

    @Transactional(readOnly = false) 
    public void saveMyData(MyData myData) { 
     // an instance of sqlMap connected to master should be used 
    } 
} 

Câu hỏi đặt ra là - làm cách nào tôi có thể thực hiện việc này?

Cảm ơn rất nhiều

Trả lời

4

Đó là một ý tưởng thú vị, nhưng bạn sẽ có một công việc khó khăn trên tay. Thuộc tính readOnly được dự định làm gợi ý cho người quản lý giao dịch và không thực sự được tư vấn ở bất cứ đâu có ý nghĩa. Bạn sẽ phải viết lại hoặc mở rộng nhiều lớp cơ sở hạ tầng Spring. Vì vậy, trừ khi bạn đang bẻ cong về việc làm việc này một cách bạn muốn, lựa chọn tốt nhất của bạn gần như chắc chắn để tiêm hai đối tượng riêng biệt SqlMapClient vào DAO của bạn, và cho các phương pháp để chọn phù hợp nhất. Chú thích @Transactional cũng sẽ cần phải cho biết người quản lý giao dịch nào sẽ sử dụng (giả sử bạn đang sử dụng DataSourceTransactionManager thay vì JpaTransactionManager), cẩn thận để phù hợp với người quản lý giao dịch với số được sử dụng bởi SqlMapClient.

+0

Có cách nào dễ dàng hơn với AspectJ không? – artemb

+0

@artemb: I.m chắc chắn AspectJ sẽ giúp, nhưng nó vẫn sẽ không dễ dàng. – skaffman

Các vấn đề liên quan