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