Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Include newly added data sources into route Data Source object without restarting the application server

Implemented Spring's AbstractRoutingDatasource by dynamically determining the actual DataSource based on the current context. Refered this article : https://www.baeldung.com/spring-abstract-routing-data-source.

Here on spring boot application start up . Created a map of contexts to datasource objects to configure our AbstractRoutingDataSource. All these client context details are fetched from a database table.

@Bean
    @DependsOn("dataSource")
    @Primary
    public DataSource routeDataSource() {

        RoutingDataSource routeDataSource = new RoutingDataSource();

        DataSource defaultDataSource = (DataSource) applicationContext.getBean("dataSource");

        List<EstCredentials> credentials = LocalDataSourcesDetailsLoader.getAllCredentails(defaultDataSource); // fetching from database table

        localDataSourceRegistrationBean.registerDataSourceBeans(estCredentials);

        routeDataSource.setDefaultTargetDataSource(defaultDataSource);
        Map<Object, Object> targetDataSources = new HashMap<>();

        for (Credentials credential : credentials) {
            targetDataSources.put(credential.getEstCode().toString(),
                    (DataSource) applicationContext.getBean(credential.getEstCode().toString()));
        }
        routeDataSource.setTargetDataSources(targetDataSources);

        return routeDataSource;
    }

The problem is if i add a new client details, I cannot get that in routeDataSource. Obvious reason is that these values are set on start up.

How can I achieve to add new client context and I had to re intialize the routeDataSource object.

Planning to write a service to get all the client context newly added and reset the routeDataSource object, no need to restart the server each time any changes in the client details.

like image 213
user630209 Avatar asked Mar 11 '26 11:03

user630209


1 Answers

So this will depend on how much you know about the datasources to be added, but you could set this up as a multi-tenant project. Another example of creating new datasources:

@Autowired private Map <String, Datasource> mars2DataSources;

public void addDataSourceAtRuntime() {

    DataSourceBuilder dataSourcebuilder = DataSourcebuilder.create(
        MultiTenantJPAConfiguration.class.getclassloader())
            .driverclassName("org.postgresql.Driver")
            .username("postgres")
            .password("postgres")
            .url("Jdbc: postgresql://localhost:5412/somedb");

        mars2DataSources("tenantX", datasourcebuilder.build())
}
like image 162
Kevin McCann Avatar answered Mar 12 '26 23:03

Kevin McCann



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!