2016-11-16 21 views
6

में दो datasources का उपयोग करते हुए मैं साथ एक डेटाबेस अपने प्रोजेक्ट में Spring Boot 1.3.3 उपयोग कर रहा हूँ, अब मैं एक ही स्कीमा लेकिन विभिन्न कनेक्शन साथ दो डेटाबेस का उपयोग करना चाहते।स्प्रिंग बूट

मैं उसी रिपॉजिटरीज, इकाइयों का उपयोग करना चाहता हूं और वसंत को बताने का तरीका ढूंढना चाहता हूं जो डेटासॉर मैं स्थिति के आधार पर उपयोग करना चाहता हूं।

सबसे पहले अपने application.properties इस तरह दिखना चाहिए:

+0

application.yml –

+0

@Zubair में स्प्रिंग सक्रिय प्रोफाइल का उपयोग करें, मैं एक ही समय में दोनों का उपयोग करना चाहता हूं और मेरी सेवा की स्थिति के आधार पर एक या दूसरे का चयन करना चाहता हूं। –

+0

@JeanCedron यह एक जटिल सेटअप है। सवाल को चकमा देने के लिए नहीं, लेकिन क्या आपने इसे हल करने के लिए मैसेजिंग परत का उपयोग करने के बारे में सोचा है? डिकिडर ऐप निर्णय लेता है कि किस डेटासोर्स को जारी रखना है। फिर यह एक डेटास्रोत विशिष्ट कतार में एक संदेश भेजता है जिसके लिए एक कर्मचारी नोड डेटा पढ़ता है और बना रहता है। बस एक विचार ... मैंने कुछ दोहरी डेटासॉर ऐप्स किए हैं लेकिन वे पूरी तरह से पैकेज, संस्थाओं, भंडारों आदि के संबंध में अलग पैकेज थे। –

उत्तर

5

किसी को भी इस समस्या है, मैं समाधान मिल गया है

datasource: 
primary: 
    url: jdbc:mysql://localhost:3306/primary_db 
    username: your_username 
    password: your_password 
    driver-class-name: com.mysql.jdbc.Driver 
secondary: 
    url: jdbc:mysql://localhost:3306/secondary_db 
    username: your_username 
    password: your_password 
    driver-class-name: com.mysql.jdbc.Driver 

उसके बाद, आप के साथ एक enum बनाने के लिए अपने डेटाबेस:

public enum Database { 
    PRIMARY, 
    SECONDARY 
} 

उसके बाद, आप एक ThreadLocal बनाएँ:

public class DatabaseThreadContext { 

    private static final ThreadLocal<Database> current = new ThreadLocal<>(); 

    public static void setCurrentDatabase(Database database) { 
     current.set(database); 
    } 

    public static Object getCurrentDatabase() { 
     return current.get(); 
    } 

} 

यहाँ आता है जादू, आप का उपयोग करने के AbstractRoutingDataSource जो स्प्रिंग 2 में लागू किया गया था 2007 में वापस:

public class RoutingDataSource extends AbstractRoutingDataSource { 

    @Override 
    protected Object determineCurrentLookupKey() { 
     return DatabaseThreadContext.getCurrentDatabase(); 
    } 

} 

अंत में अपने स्प्रिंग बूट App में एक विन्यास इंजेक्षन:

@Configuration 
public class DatabaseRouter { 

    @Bean 
    @ConfigurationProperties(prefix="datasource.primary") 
    public DataSource primaryDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    @ConfigurationProperties(prefix="datasource.secondary") 
    public DataSource secondaryDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    @Primary 
    public DataSource dataSource() { 
     Map<Object, Object> targetDatasources = new HashMap<Object, Object>(){{ 
      put(Database.SECONDARY, secondaryDataSource()); 
      put(Database.PRIMARY, primaryDataSource()); 
     }}; 
     RoutingDataSource routingDataSource = new RoutingDataSource(); 
     routingDataSource.setDefaultTargetDataSource(primaryDataSource()); 
     routingDataSource.setTargetDataSources(targetDatasources); 
     routingDataSource.afterPropertiesSet(); 
     return routingDataSource; 
    } 

} 

प्रत्येक अनुरोध में, यदि आप अपने डेटाबेस के बीच बदलना चाहते हैं तो आप बस इस फ़ंक्शन का उपयोग करें: DatabaseThreadContext.setCurrentDatabase(Database.PRIMARY);

इसके अलावा, आप एक ही समय में दो से अधिक डेटाबेस प्राप्त कर सकते हैं।