POOL DE CONEXIONES
Que es?
Archivos .jar necesarios
Configuración
Clases para manejar el pool
Que es
El pool de conexiones nos permite administrar eficientemente las conexiones de nuestra aplicación a una base de datos. Cuando necesitemos interactuar con la base de datos simplemente lo hacemos a través del pool, este creara una sola conexión a la base de datos , a la que podemos acceder.
Archivos .jar necesarios
Dependiendo de la base de datos que usemos, debemos obtener los .jar jdbc y copiarlos dentro:
netbeans_home\enterprise2\jakarta-tomcat-5.5.7\common\lib
Configuración
Para configurar el pool, buscamos el archivo context.xml, ubicado dentro de la carpeta META-INF de nuestro proyecto. Indicamos la configuración para el pool, colocando el nombre para el pool, el driver jdbc, la base datos, el usuario y password.
name="jdbc/avbravo"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
password="postgres"
maxIdle="2"
maxWait="5000"
username="postgres"
url="jdbc:postgresql://localhost:5432/academicoazuero"
maxActive="4"/>
Figura del context.xml
Configurar el archivo web.xml, para permitir a nuestras clases java, usar el pool. Añadimos eñ resource-ref.
Clases que usan el pool.
Definimos una clase que se encargue de manejar la conexión con el pool, y ejecutar las sentencias sql.
Crear el paquete com.avbravo.basedatos para la clase conexión y el paquete com.avbravo.usuarios para almacenar la clase del usuario.
/*
* conexion.java
*
* Created on 17 de noviembre de 2005, 08:58 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.avbravo.basedatos;
/**
*
* @author aristides
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.Statement;
public class conexion {
private Connection conn;
private Statement stmt;
private ResultSet rs;
private String myError="";
private Logger logger = Logger.getLogger("com.avbravo.basedatos");
/** Creates a new instance of conexion */
//PROPERTY myError
public String getError() {
return this.myError;
}
//PROPERTY: rs
public ResultSet getResultSet() {
return this.rs;
}
//carga el pool de conexiones
public boolean conectarPool(){
try{
Context ctx = new InitialContext();
if (ctx == null) {
this.myError ="No initial context";
return false;
}
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/avbravo");
if (ds == null) {
this.myError= "No data source";
return false;
}
conn = ds.getConnection();
if (conn == null){
this.myError = "No connection";
return false;
}
return true;
}catch (SQLException ex) {
this.myError = "SQLException " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
} catch (NamingException ex) {
this.myError = "NamingException " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
} catch (Exception ex) {
this.myError = "Exception " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
}
}//conectarPool()
//ejecutarQuery(String)
//ejecuta una sentencia sql
public boolean ejecutarQuery(String sql) {
try{
if (sql.equals("")){
this.myError ="Sentencia sql vacia";
return false;
}
if (conectarPool() == false)
return false;
else {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
return true;
}
}catch (SQLException ex) {
this.myError = "SQLException " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
} catch (Exception ex) {
this.myError = "Exception " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
}
}//ejecutarQuery
//ejecutarUpdate(String)
//ejecuta una sentencia sql
public boolean ejecutarUpdate(String sql) {
try{
if (sql.equals("")){
this.myError ="Sentencia sql vacia";
return false;
}
if (conectarPool() == false)
return false;
else {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate(sql);
return true;
}
}catch (SQLException ex) {
this.myError = "SQLException " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
} catch (Exception ex) {
this.myError = "Exception " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
return false;
}
}//ejecutarQuery
//cerrarPool()
//cierra el pool de conexiones
public void cerrarPool() {
try{
conn.close();
}catch (SQLException ex) {
this.myError = "SQLException " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
} catch (Exception ex) {
this.myError = "Exception " + ex.getMessage();
logger.log(Level.SEVERE, "loginAction", ex);
}
}
}//class
clase usuarios.
/*
* usuarios.java
*
* Created on 17 de noviembre de 2005, 09:02 AM
*
Comments
Muchas gracias.
Muchas gracias.
Pero ¿qué sucede si, a parte de la seguridad de la aplicacion, existe seguridad en la base de datos y cada usuario tiene acceso a solo determinadas tablas para lo que utiliza un usuario y password de base de datos propio?
En este caso, ya no sería util el pool de conexiones, ¿verdad?.
¿Se te ocurre alguna manera de optimizar la velocidad de conexión, etc... con la base de datos?
Gracias, Kike
disculpa, podrias enviarme la clase usuarios a mi correo: jpmoralesf@hotmail.com
Muchas gracias
Gracias.
Gracias.
Gracias.
Con visual web, te permite utilizar las bases de datos de manera sencilla.
necesito las url para conectarme con los jdbc de SQL-pl/slqserver200x/oracle
y donde los encuentro.
todos configurados en SQLEXPLORER.
pliiis podrias darme consejos.