Multiples conexiones en Spring a diferentes Bases de Datos

Buena tarde compañeros,

Espero me puedan ayudar con sugerencias y/o comentarios. Actualmente estoy desarrollando una aplicación de gastos médicos, en el que tengo que conectarme a 2 Bases de Datos, la propia de la aplicación y otra donde esta la información de los empleados.

Lo estoy desarrollando en spring con JDBC

Mi archivo de configuracion de spring declaro:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/gastosmedicos" />
</bean>
     
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

En donde declaro un bean jdbcTemplate que hace referencia a un dataSource y este tiene el JDNI.

Una de las varias clases de implementacion es esta:

@Component
public class DatosFiscalesDaoImpl implements DatosFiscalesDao{
       
        private JdbcTemplate jdbcTemplate;

        public static final String MERGE_DATOS_FISCALES = "MERGE...";
                       
        public void setDatosFiscales(DatFiscalesTO datos){
                logger.info("DatosFiscalesDaoImpl.setDatosFiscales");
                jdbcTemplate.update(MERGE_DATOS_FISCALES,
                                datos.getNum_empleado(),
                                datos.getRfc(),
                                datos.getCalle(),
                                datos.getNumero(),
                                datos.getColonia(),
                                datos.getCp(),
                                datos.getDeleg_mun(),
                                datos.getEntidad());
        }
       
        @Autowired
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
                this.jdbcTemplate = jdbcTemplate;
        }

Mi duda es como configurar la segunda Base de Datos, no se si con simplemente generar otro DataSource y otro jdbcTemplate con diferente id y con ese bastaría para llamarlo en mis clase de implementacion o tendría que realizar otra configuracion o tomar otros aspectos.

Muchas gracias por sus comentarios.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de javadicto

2 Datasource

Asi es, debes declarar 2 datasources (obvio con nombre de id diferente) apuntando cada uno al JNDI correspondiente, en tus DAO debes inyectar según tus necesidades (uno o los dos datasources), no recuerdo si es necesario indicar el schema.table cuando realizas tus querys.

Imagen de neko069

Algo como..

<bean id="dataSourceLocal" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/gastosmedicos" />
</bean>
     
<bean id="jdbcTemplateLocal" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSourceLocal"/>
</bean>

<bean id="dataSourceRemoto" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/REMOTO" />
</bean>
     
<bean id="jdbcTemplateRemoto" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSourceRemoto"/>
</bean>

Y en tus clases:

@Component
public class DosDatasourceDaoImpl{
       @Autowired
        private JdbcTemplate jdbcTemplateLocal;
        @Autowired
        private JdbcTemplate jdbcTemplateRemoto;
   
      /* y ya, puedes usar ambos templates los cuales invocan su respectivo data source*/      

}

2 Datasource

Ok muchas gracias javadicto

Algo como..

Gracias neko069, muy ilustrativo el ejemplo.

Imagen de ezamudio

@Resource

La otra es que uses @Resource en vez de @Autowired, y definas el nombre del bean ahí mismo. Así te saltas el setter:

public class Foo {
  @Resource(name="jdbcTemplate1")
  private JdbcTemplate uno;
  @Resource(name="jdbcTemplate2")
  private JdbcTemplate dos;
}