cambiar dinámicamente fuente de datos de spring

Tengo una aplicación Spring, quiero cambiar la fuente de datos de forma dinámica, es decir. cuando ingresamos una URL de DS, los beans de Spring y todas las dependencias se actualizarán automáticamente. Sé que esto es algo extraño, pero de todos modos quiero lograr eso. La configuración de My Spring es la siguiente:

               

Las preguntas son:

  1. La URL de JDBC se almacena en propiedades, que podrían modificarse en tiempo de ejecución.

  2. Una vez que se cambia la URL, necesito volver a crear la fuente de datos y tal vez los objetos dependientes. No pude entender cómo hacerlo elegantemente en spring?

He sabido que Spring did podría enrutar dinámicamente la fuente de datos basada en una clave, pero la fuente de datos URL está predefinida en Spring y no cambiará el tiempo de ejecución. No es mi caso.

Puede usar AbstractRoutingDataSource de Spring extendiéndolo y reemplazando el método determineCurrentLookupKey() que debe devolver la clave que hace referencia al bean de spring del origen de datos que se utilizará.

Eche un vistazo a este artículo de blog en el blog de Spring Source que le mostrará un ejemplo de cómo usar esa característica.

Básicamente para responder a sus preguntas, lo que deberá hacer es definir las dos fonts de datos como diferentes bean de spring en su configuración XML. No es necesario crear uno de forma dinámica, Spring cargará ambos y utilizará uno u otro de forma dinámica según sus criterios en el método determineCurrentLookupKey() .

Esto llevaría a algo así como:

Configuración XML

                                    

Java

 public class MyRoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // get the current url HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); if (request.getRequestURL().toString().endsWith("/minor")) return "MINOR"; else return "MAJOR"; } } 

No estoy seguro de si esta es la forma correcta de hacerlo, pero lo que puede hacer es algo como esto.

            

y en Java Class

 public class TestTransaction { @Autowired private DataSourceTransactionManager manager; private PlatformTransactionManager transactionManager; public testExecution(DataSource ds) { manager.setDataSource(ds); transactionManager = manager; TransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { jdbcTemplate.update(); transactionManager.commit(status); } catch (Exception ex) { transactionManager.rollback(status); } } } 

Por favor sugiera si este enfoque podría funcionar ya que todavía soy nuevo en Spring