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:
<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:
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.
- Inicie sesión o regístrese para enviar comentarios
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.
Algo como..
<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:
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.
@Resource
La otra es que uses @Resource en vez de @Autowired, y definas el nombre del bean ahí mismo. Así te saltas el setter:
@Resource(name="jdbcTemplate1")
private JdbcTemplate uno;
@Resource(name="jdbcTemplate2")
private JdbcTemplate dos;
}
@Resource
Gracias @ezamudio