2011-11-10 22 views
5

Tôi đang sử dụng MVC mùa xuân + ngủ đông + hai cơ sở dữ liệuChange đậu sở hữu/giá trị trong thời gian chạy vào mùa xuân

Vì vậy, ví dụ: tôi tạo 2 sessionFactories. sessionFactory1 (sử dụng datasource1) và sessionFactory2 (sử dụng datasource2).

Có thể thay đổi sessionFactory1 hoặc sessionFactory2 thành sessionFactory khi chạy để dao/tham chiếu chúng. sessionFactory đã được autowired cho tất cả các dao/s.

Tôi đang tìm kiếm nó ngay bây giờ Tôi nghĩ @Configuration có thể giúp tôi nhưng tôi không chắc chắn.

Tôi đang thử AbstractRoutingDataSource nhưng không nghĩ rằng nó sẽ giúp ích.

+0

có ai biết giải pháp không ?? – precursor

+0

không chắc chắn tôi có được nó, bạn có thể tiêm đúng nhà máy vào mỗi DAO? – aishwarya

+1

Ok Tôi hiện có thể thay đổi cơ sở dữ liệu tôi sử dụng bằng AbstractDataSource với sự trợ giúp của http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ – precursor

Trả lời

1

Thông thường Spring dây hạt của bạn khi khởi động ứng dụng, vì vậy "tái đấu dây" (thay thế tham chiếu đến sessionFactory1 với tham chiếu đến sessionFactory2 khi chạy) có vẻ không dễ thực hiện.

Có thể bạn có thể triển khai "proxy bean" được kết nối với đối tượng DAO của bạn và thay đổi "target SessionFactory" của bean proxy của bạn.

0

AbstractRoutingDataSource sẽ hoạt động cho bạn.

Trước tiên, bạn sẽ cần phải tạo ra một lớp mà sẽ lưu trữ các DB hiện tại đang sử dụng:

public class MyContextHolder { 

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 

    public static void setDBContext(String dBContext) { 
     contextHolder.set(dBContext); 
    } 

    public static String getDBContext() { 
     return (String) contextHolder.get(); 
    } 

    public static void clearDBContext() { 
     contextHolder.remove(); 
    } 

} 

Bạn sẽ cần phải tạo ra một lớp mà kéo dài này và thực hiện determineCurrentLookupKey(), và trả lại db hiện tại bạn có trong ngăn giữ ngữ cảnh:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class MyRoutingDataSource extends AbstractRoutingDataSource { 

    @Override 
    protected Object determineCurrentLookupKey() { 
     return MyContextHolder.getDBContext(); 
    } 
} 

Xem ví dụ trong http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/. Nó làm việc tốt cho tôi.

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