2010-08-06 14 views
9

Estoy trabajando en una aplicación en la que necesito conectar N número de sistemas de bases de datos [N varía entre 1 y 350].JDBC - Conectar varias bases de datos

La idea es que al usuario se le presentará una lista de bases de datos y se le pedirá que seleccione cualquiera o todas las bases de datos de la lista.

Una vez que se seleccionan las bases de datos, necesito conectarme a cada una de las bases de datos y ejecutar un procedimiento almacenado.

Estoy planeando usar un JDBC simple antiguo y obtener conexión para cada uno de ellos una vez [o ejecutarlos en varios hilos] y ejecutar el procedimiento de almacenamiento y cerrar la conexión.

Y todo esto debería suceder en una transacción. ¿Cuál es la mejor manera de hacer esto?

Si no es JDBC ... ¿alguna otra manera eficiente?

Actualización -

El procedimiento almacenado está realmente involucrado en la ejecución de algunos sql - por ejemplo, la actualización de una columna, conceder permiso para que un usuario etc.

+1

qué tipo de aplicaciones? ¿De escritorio o web? – skaffman

+0

Es una aplicación web. – jagamot

+0

Según tengo entendido, no es necesario que haga esto en una sola transacción, ¿es así? Se deben tener en cuenta otras muchas más. – BalusC

Respuesta

3

que crearía un conjunto de subprocesos con un importe máximo razonable de hilos, entre diez y veinte hilos tal vez, con la ayuda de Executors#newFixedThreadPool() e invocar las tareas de conexión DB y de ejecución de SP por separado, cada uno como Callable utilizando ExecutorService#invokeAll(). Le gustaría jugar con la cuenta de hilos y el perfil que produce el mejor rendimiento después de todo.

Cada implementación de Callable debe tomar los detalles de conexión y el nombre SP como argumento de constructor para que pueda reutilizar la misma implementación para diferentes llamadas a bases de datos.


actualización: OK, es una aplicación web. No quieres perder los hilos. Si se supone que debe ser utilizado por un único usuario simultáneo, entonces realmente debe asegurarse de que el grupo de subprocesos esté correctamente shutdown al final de la solicitud o en el extremo más alto de la sesión. Pero si se supone que es utilizado por múltiples usuarios simultáneos, entonces desea compartir el grupo de subprocesos en el ámbito de la aplicación. También aquí, debe asegurarse de que se cierre correctamente cuando la aplicación web se apaga. El ServletContextListener es útil aquí.

0

Esto suena como un desastre, pero es su problema.

Necesita un grupo de conexiones por base de datos. No aconsejaría que intente manejar el ciclo de vida de la conexión usted mismo. Deje que el servidor de la aplicación haga eso por usted.

Si desea que un grupo de bases de datos participe en una gran transacción, deberá usar los controladores JDBC XA para todos ellos. También necesitará un administrador de transacciones JTA para supervisar la transacción por usted.

Los procedimientos almacenados no pueden contener ninguna lógica para manejar transacciones; tienes que dejar que JTA lo haga.

No dice qué está haciendo el procedimiento almacenado. Si no necesita devolver nada, un diseño alternativo podría ser JMS, una cola y un grupo de escucha. Me preocuparía el enhebrarlo si fuera tú. Encontraría una manera de dejar que el contenedor haga esas cosas complicadas para mí si pudiera.

+0

Supongo que todas las URL de conexión a la base de datos se mantienen en una base de datos central. Creo que no queremos crear fuentes de datos en el servidor de aplicaciones [como he mencionado Tengo alrededor de 1 - 350 fuentes de datos] ..... en cuyo caso, supongo que tengo que manejar el ciclo de vida de la conexión ¿verdad? – jagamot

1

Como Duffymo indicó en su comentario, solo podrá realizar transacciones en múltiples bases de datos si tiene un coordinador de transacciones y una confirmación de dos fases.

Para esto necesitarás una pila J2EE que manejará JTA. Si está ejecutando en Tomcat u otro contenedor que no tiene JTA, hay varias opciones que puede descargar e instalar.

Por supuesto, tendrá que dejar que el contenedor, y no la base de datos/procedimiento almacenado, maneje las confirmaciones y reversiones de transacciones.

2

Si es aceptable que use dos conexiones, use el grupo de conexiones c3p0 para administrarlas. Para conectar dos bases de datos Declaro:

public Connection connection1; 
public Connection connection2; 
DataSource dataSource1; 
DataSource dataSource2; 

luego dos métodos similares:

public Connection dbConnect1() throws SQLException { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    try { 
     cpds.setDriverClass("com.mysql.jdbc.Driver"); 
    } catch (PropertyVetoException e) { 
    } 
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/myDatabase1?autoReconnect=true"); 
    cpds.setUser("myMYSQLServerLogin"); 
    cpds.setPassword("myMYSQLServerPassword"); 
    cpds.setMinPoolSize(5); 
    cpds.setAcquireIncrement(5); 
    cpds.setMaxPoolSize(20); 
    cpds.setMaxIdleTime(60); 
    cpds.setMaxStatements(100); 
    cpds.setPreferredTestQuery("SELECT 1"); 
    cpds.setIdleConnectionTestPeriod(60); 
    dataSource1 = cpds; 
    connection1 = dataSource1.getConnection(); 
    return connection1; 
} 

public Connection dbConnect2() throws SQLException { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    try { 
     cpds.setDriverClass("com.mysql.jdbc.Driver"); 
    } catch (PropertyVetoException e) { 
    } 
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/myDatabase2?autoReconnect=true"); 
    cpds.setUser("myMYSQLServerLogin"); 
    cpds.setPassword("myMYSQLServerPassword"); 
    cpds.setMinPoolSize(5); 
    cpds.setAcquireIncrement(5); 
    cpds.setMaxPoolSize(20); 
    cpds.setMaxIdleTime(60); 
    cpds.setMaxStatements(100); 
    cpds.setPreferredTestQuery("SELECT 1"); 
    cpds.setIdleConnectionTestPeriod(60); 
    dataSource2 = cpds; 
    connection2 = dataSource2.getConnection(); 
    return connection2; 
} 
+0

Simplemente hazlo en un ciclo para tus 350 bases de datos. Extraiga los parámetros de cada base de datos de su base de datos principal si es necesario para limpiar el código. – Zon

Cuestiones relacionadas