Consulta para conexión a múltiples esquemas de BD en aplicación web.

hola, he estado leyendo los temas tratados en la pagina y me ha ayudado para conocer sobre nuevas tecnologías para programar en java. me comunico con ustedes en este momento porque tengo una duda quisiera saber si me pueden guiar un poco, en la empresa que trabajo tenemos un proyecto esta desarrollado en java y hace uso de icefaces 1.6, hibernate 3.1, nitobi, dhtmlx, jasperReports, y consultas mdx, el proyecto estaba pensado inicialmente para funcionar para un país, ahora la empresa se ha expandido y el proyecto debe funcionar en otros 2 países, la solución rápida y errónea a mi parecer que dieron acá fue crear una copia exacta del proyecto para cada uno de los países ya que cada uno se conecta a un esquema de base de datos diferente, ademas hay ciertos parámetros quemados dentro de la aplicación que se pueden obtener a travez de la bd por ejemplo condiciones que hagan referencia al id del país o cosas por el estilo. El mantenimiento de la aplicación se esta complicando ya que es código repetido por todo lado y los errores se han replicado obviamente. He estado buscando algo que me permita manejar "múltiple conexión a bd" que creo que es el principal problema a atacar para lograr integrar toda la aplicación y solo necesitar un proyecto con posibilidad de múltiples conexiones de acuerdo al país que se desee acceder, pero no he encontrado nada al respecto tal vez porque busco con el termino erróneo, por tal motivo acudo a ustedes para saber si en su experiencia y conocimiento saben de algo que me pueda permitir lo que deseo. De antemano muchas gracias

otra de las cosas que estoy pensando proponer es cambiar la parte gráfica que se maneja actualmente con icefaces, nitobi y dhtmlx para dejar solo 1 ya sea uno de estos u otra librería mas completa y dinámica para la parte gráfica.

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.

Otro punto

Una de las "excusas" por las cuales se hizo de esta forma era para tener separados los proyectos, están montados en un servidor de aplicaciones tomcat 6.0 y con la ayuda de probe se puede manipular cada aplicación por aparte, así si sucede una falla en alguna de las aplicaciones solo afectaría 1 de ellas y no pararían la producción de las demás.

tendrias que sar i18n.. pero bueno!

Bueno, en las aplicaciones multilenguaje lo tipico es utilizar i18n y con ajustes de JSF mandas a llamar el properties del lenguaje segun consultes el recurso web....

Tu pregunta es como cargar dos diferentes Data sources?
Bueno la manera mas simple es que hagas dos diferentes archivos de configuracion de Hibernate y cuando tengas que crear el SessionFactory mandas a llamar la configuracion de ese xml

Configuration().configure("/hibernate_oracle.cfg.xml").buildSessionFactory();
Configuration().configure("/hibernate_postgres_A.cfg.xml").buildSessionFactory();
Configuration().configure("/hibernate_postgres_B.cfg.xml").buildSessionFactory();

recuerda que en el XML le das la configuracion de conexion y leindicas la DB con la cual se va a trabajar

Imagen de ezamudio

no entendí...

Lo mejor es que tengan las aplicaciones separadas, por lo tanto no es necesario que la aplicación se pueda conectar a múltiples bases de datos, porque cada instancia de la aplicación usa una base de datos distinta.

Yo incluso tendría un contenedor para cada aplicación, en equipos dedicados. Pero si no se puede pues ni modo, tres contenedores en el mismo equipo puede ser mucho y en ese caso no queda más que tener las 3 apps corriendo en el mismo contenedor. Con que tengan distinto nombre es suficiente.

En cuanto a tu DataSource, pues es cosa de que al armar cada WAR, metas una definición distinta del DataSource en cada uno, para que cada instancia se conecte a la base de datos que le toca. Si son JNDI pues solamente tienes que cambiar la referencia de cada una; si son pools de conexiones definidos en la app, es cosa de tener las definiciones por separado (url, usuario, passwod) y meter la correcta en cada WAR.

muchas gracias, tratare de explicar mejor

gracias por su pronta respuesta,
tratare de explicar mejor aunque lo que me han dicho me parece valido.
Actualmente en el servidor de aplicaciones hay 3 proyectos
/tomcat
/webapps
proyecto_1
proyecto_2
proyecto_3
los 3 proyectos son exactamente igual lo único de diferente es que cada uno hace conexión a un esquema diferente de la misma base de datos (oracle 10g), lo que se me ocurre para tener solo 1 proyecto y evitar replicar tanto código, seria que la conexión al esquema fuera dinámica, por ejemplo que en una pantalla al inicio de la aplicación saliera un listbox con los países (Colombia, Ecuador, Salvador) y de acuerdo al que se seleccione se elija el esquema al cual conectarse. Teniendo en cuanto lo que me comentan del datasource me llamo la atención lo que dice java.daba.doo de crear otros 2 archivos de configuración de hibernate, adicionalmente a esto se me ocurre si se puede de alguna forma pasar un parámetro de acuerdo a lo seleccionado en listbox para indicarle al HibernateSessionFactory que archivo de configuración de hibernate tomar. Es que lo mas probable es que mas adelante vamos a tener que duplicar de nuevo los proyectos para 2 nuevos países, entonces crear 2 archivos de configuración seria mas corto en tiempo que duplicar esos proyectos tal cual solo para en cada uno definirle un esquema nuevo de conexión, sin comentar que se ira haciendo mas complicado el mantenimiento porque los cambios en un proyecto se tienen que replicar en los demás.

Imagen de ezamudio

pero por qué?

OK, ahora lo que no entiendo es por qué quieres juntar las aplicaciones. No hay duplicación de código como dices, a menos que tuvieras una copia del código fuente por cada país y las 3 copias son idénticas (excepto por la cadena de conexión a base de datos). Pero si compilas una sola aplicación y luego haces 3 copias del WAR resultante para ponerles 3 cadenas de conexión distinta, yo creo que así estás mejor.

Si luego uno de esos 2 países tiene mucho más tráfico y hay que ponerlo en un equipo aparte o en otro datacenter, etc, con tu esquema actual no tienes que hacer nada especial, simplemente montan otro contenedor en donde sea, se llevan la base de datos y ponen la aplicación a funcionar y listo. Si tuvieras una sola aplicación con opción a conectarse a una de 3 bases de datos distintas, entonces sería un problema cuando quieran poner una a funcionar de manera separada.

otra vez: i18n

Es entonces cando entra i18n como interceptor peudes manejar internacionalización en tus aplicaciones. Lo que puedes hacer es recibir la localizacion de consulta y puedes guardar un estado de localizacion (o consultarlo e todo mo mento) la cosa es que si vas a leer informacion de diferentes bases de datos pues lo primero es saber cual voy a leer.

Si fuera problema mio lo que haria es cargar a Spring todos los config de hibernate y le haria una inyeccion de dependencias dinamica de acuerdo a la localización de consulta, de esa forma les asignas el SessionFactory adecuado a tus DAO

muchas gracias

muchas gracias por sus respuestas han sido de gran utilidad, viendo los pro y los contras de tener solo una aplicación decidí que es mejor unificar el código fuente como dice ezamudio y mas bien crear 3 WAR con conexiones diferentes correspondiente a cada uno de los esquemas de base de datos, esto para facilidad de control y seguimiento de las aplicaciones por separado y para mayor portabilidad en caso de necesitar mover alguna de ellas a otra maquina. De nuevo muchas gracias a los dos por sus respuestas.