Hola.. ¿Cómo estan?
En la clase siguiente me permite establecer conexion hacia la Base de Datos, que actualente son 3 BD. Anexo trozo de la clase:
Código:
public class DBPoolManager {
public static final String KEYS_KEY = "pool_keys";
public static final String NAME_KEY = "name";
public static final String LOOKUP_KEY = "lookup";
private static DBPoolManager instance;
private Map datasources = null;
private Logger log = null;
private synchronized void init() throws SQLException {
//
// Inicializa la clase Logger del administrador de conexiones.
try {
log = new Logger("DBPoolManager.log");
} catch (IOException e) {
e.printStackTrace();
}
log.log("\n-----------------------------------------\n"
+ "--- INICIALIZANDO POOLS DE CONEXIONES ---\n"
+ "-----------------------------------------\n");
//
// obtiene el caracter separador de directorios (dependiente del SO)
char c = File.separatorChar;
//
// obtiene el InputStream del archivo de properties de pool
InputStream is = getClass().getResourceAsStream("properties" + c + "pools.properties");
//
// crea store de properties
Properties props = new Properties();
//
// carga las properties desde el InputStream
try {
props.load(is);
}
catch (Exception e) {
// by TM
log.log("properties" + c + "testdb_pools.properties");
e.printStackTrace(log.getWriter());
log.log("No se pudo leer el archivo de propiedades de la base de datos.");
// HEY THIS IS A FATAL!!!!!!!!!!
// ToDo: ?? and now ... ?? ;)
}
//
// get pool names property
String poolKeysProperty = props.getProperty(KEYS_KEY);
//
// tokenize this by spaces and return an arrry of pool names entries
String poolKeys[] = tokenize(poolKeysProperty);
//
// create Initial Context
Context context = null;
try {
context = new javax.naming.InitialContext();
} catch (NamingException e) {
e.printStackTrace();
throw new SQLException("Error al tratar de acceder al InitialContext.");
}
//
// create datasources map
datasources = new HashMap();
log.log("poolKeys.length "+poolKeys.length);
//
// iterate every entry
for(int i=0; i<poolKeys.length; i++) {
String poolKey = poolKeys[i];
String name = props.getProperty(poolKey+"."+NAME_KEY);
name = (name==null)? poolKey : name;
String lookup = props.getProperty(poolKey+"."+LOOKUP_KEY);
DataSource ds = null;
try {
ds = (DataSource)context.lookup(lookup);
log.log("Establishing Connection with : "+name);
datasources.put(name,ds);
} catch (NamingException e) {
//
// no da error porque quizas la aplicacion pueda seguir funcionando (sin toda su capacidad seguro)
// sin este pool en particular.
log.log(e.getMessage());
}
}
/* ******************** */
// Variables del Método
DBConnection dbConn = null;
OracleResultSet dbResult = null;
String name = null;
String jndi= null;
DataSource ds=null;
String query = "begin ? := PAQUETE_BD.func_consultar; end;";
try {
// Conexión al Pool de Base de Datos
dbConn = DBUtil.getConnection();
if (dbConn == null) {
log.log("[email protected]: No se pudo crear la conexión con la base de datos.");
}
dbConn.prepareCall(query);
dbConn.registerOutParameter(1, OracleTypes.CURSOR);
// Ejecución del Query
dbConn.executeCallableStatement();
// Resultados del Query
dbResult = dbConn.cgetResultSet(1);
// Agregar los dataSource desde la tabla e BD tabla
while(dbResult.next()){
name = dbResult.getString(1);
jndi = dbResult.getString(2);
ds = (DataSource)context.lookup(jndi);
log.log("Establishing Connection with : "+name);
datasources.put(name,ds);
}
// Cierre del ResultSet
dbResult.close();
// Validación del Resultado
if (jndi.equals(null)) {
log.log("No se encontraron registros para la consulta de nodos");
}
} catch (Exception e) {
log.log(e.getMessage());
} finally {
DBUtil.closeConnection(dbConn);
}
/* ********************* */
}
private DBPoolManager() throws SQLException {
init();
}
public DBConnection getConnection(String name) {
DataSource ds = (DataSource) datasources.get(name);
DBConnection dbConnection;
if (ds != null) {
Connection connection = null;
try {
connection = ds.getConnection();
dbConnection = new DBConnection(connection);
} catch (SQLException e) {
log.log(".getConnection() - ERROR!!. No fue posible obtener una conneccion del datasource "+name+". Se retorna null.");
e.printStackTrace();
return null;
}
return dbConnection;
}
else {
log.log(".getConnection() - ERROR!!. El datasource de nombre "+poolname+" no fue encontrado. Se retorna null.");
return null;
}
} //FIN METODO
} //FIN CLASE
En el archivo .properties tengo el nombre de 1 BD con el jdbc por ejemplo:
Código:
pool_keys=name_BD1
rvirtual.name=name_BD1
rvirtual.lookup=jdbc/ORA9I_name_BD1
y en la tabla de BD tengo los otros 2 nombres de Base de Datos con sus jdbc respectivo.
La funcion
PAQUETE_BD.func_consultar; end;"; retorna un cursor con las otras dos conexiones a BD, tiene nombre y jndi
Sin embargo aun no me puedo conectar a las BD
solo a la 1ra a la q esta en el archivo .properties
Gracias.....