Cuando encontramos un objeto válido, lo movemos a la tabla de bloqueados y lo entregamos al proceso o aplicación que lo ha llamado. Si la tabla de no bloqueados está vacía, o no contiene objetos válidos, tendremos que instanciar nuevo objeto.
synchronized Object checkOut() {
long ahora = System.currentTimeMillis();
Object o;
if( nobloqueados.size() > 0 ){
Enumeration e = nobloqueados.keys();
while( e.hasMoreElements() ){
o = e.nextElement();
if( ( ahora - ( ( Long ) nobloqueados.get( o ) ).longValue() )
> tiempoExpiracion ){
// el objeto ha expirado
nobloqueados.remove( o );
expirar( o ); o = null;
}
else{
if( validar( o ) ){
nobloqueados.remove( o );
bloqueados.put( o, new Long( ahora ) );
return( o );
}
else{
// no es un objeto válido
nobloqueados.remove( o );
expirar( o );
o = null;
}
}
}
}
// no hay objetos disponibles, por lo que creamos uno nuevo
o = crear();
bloqueados.put( o, new Long( ahora ) );
return( o );
}
Ya pasó lo peor, de aquí en adelante todo se vuelve cuesta abajo. El método checkIn() simplemente mueve el objeto, dado por parámetros, desde la tabla de bloqueados ha la de los no bloqueados.
synchronized void checkIn( Object o ){
bloqueados.remove( o );
nobloqueados.put( o, new Long( System.currentTimeMillis() ) );
}
Los tres métodos restantes son abstractos, por lo que tendremos que implementarlos en la subclase. Una aplicación interesante y frecuente del pool de objetos es la de implementar un pool de conexiones a una base de datos. A continuación, la clase encargada de todo esto: JDBCConnectionPool.
import java.sql.*;
public class JDBCConnectionPool extends PoolObjetos {
private String servidor, usuario, contraseña, bd;
public JDBCConnectionPool(String driver,
String servidor,
String usuario,
String contraseña, String bd ){
...
}
Object crear() {...}
boolean validar( Object o ) { ... }
void expirar( Object o ) {...}
public Connection getConnection() { ... }
public void returnConnection( Connection c ) { ... }
}
El pool de conexiones necesitará que nuestra aplicación le especifique el driver de nuestra base de datos, el servidor, nombre de usuario, contraseña y base de datos a través del constructor. Esto último son conceptos específicos de la API JDBC (Java DataBase Connectivity).
public JDBCConnectionPool(String driver,
String servidor,
String usuario,
String contraseña,
String bd )
{
try {
Class.forName( driver ).newInstance();
}
catch( Exception e ){
e.printStackTrace();
}
this.servidor = servidor;
this.usuario = usuario;
this.contraseña = contraseña;
this.bd = bd;
}
Ahora procederemos a implementar los métodos abstractos definidos en la clase PoolObjetos: crear(), expirar() y validar().
Como ya vimos en el checkOut() , la clase PoolObjetos invocará el método crear() desde la subclase, cuando necesite instanciar un nuevo objeto. Para nuestro pool de conexiones, todo lo que tenemos que hacer es crear un nuevo objeto de tipo Connection y devolverlo. De nuevo, para no complicar este artículo, simplemente se capturan las posibles excepciones y no hacemos nada al respecto.
Object crear(){
try {
return(DriverManager.getConnection( jdbc:mysql://" +
servidor + ":3306/" + bd +
"?user="+usuario+";password="+contraseña ) );
}
catch( SQLException e ) {
e.printStackTrace();
return( null );
}
}
Usuarios que han visto este tema también han visto...
- Java y XML, JDOM
- Forzar la Finalización y la Recolección de Basura en Java
- Clases e instancias en Java.
- Instalación de GWT 1.5
- Cómo crear una clase en Java que lea desde el teclado.
Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.