conexion a un bd singleton

aleown
06 de Octubre del 2004

hola Prof. le escribo para hacerle una consultica
sobre una conexión bd sincronizada con el patrón de
diseño Singleton. La verdad de la forma que diseñe no
se si es la forma correcta y como hago para sacar los
datos del resulset en una subclase?

nicokiki
06 de Octubre del 2004
Hola!!!!!!!!

El patron Singleton si no estoy loco es usado en un constructor privado => lo q queres hacer es q la clase que "maneje" la BD tenga un constructor privado????
Si es asi, ahi va un ejemplo:

public class BaseDeDatos
{
/** Driver de la base de datos */
private static java.sql.Driver driver = null;
/** Conexion a la base de datos */
private static java.sql.Connection connection = null;
/** Instancia de la clase cDataBase */
private static BaseDeDatos instancia = null;

/** Constructor privado. Llama al metodo connect()*/
private BaseDeDatos()
{
this.connect();
}

/** Metodo static q llama al constructor privado
* @returns Instancia unica de la clase */
public static BaseDeDatos getInstancia()
{
if (instancia == null)
instancia = new BaseDeDatos();
return instancia;
}

/** Getea la conexion
* @returns Conexion a la base de datos*/
public java.sql.Connection getConnection()
{
return this.connection;
}

/** Metodo que se conecta a la base de datos de la aplicacion */
private void connect()
{
String databaseURL = "jdbc:interbase://localhost/C:/Resin/resin-2.1.9/doc/BaseGDB/base.gdb";
String user = "SYSDBA";
String password = "masterkey";
String driverName = "interbase.interclient.Driver";

try
{
// Carga del driver en memoria.
try
{
Class.forName(driverName);
}
catch (java.lang.ClassNotFoundException e)
{
System.out.println ("InterClient no se encuentra definido en el class path.");
System.out.println (e.getMessage ());
return;
}

// A esta altura el driver debería estar registrado con el driver manager.
try
{
driver = java.sql.DriverManager.getDriver (databaseURL);
System.out.println ("InterClient version " +
driver.getMajorVersion () +
"." +
driver.getMinorVersion () +
" registrada con el driver manager.");
}
catch (java.sql.SQLException e)
{
System.out.println ("No se ha podido encontrar InterClient entre los drivers registrados.");
return;
}

// Interclient esta ahora registrado con el driver manager
// Ahora se intentara conseguir una conexion con la base de datos
try
{
connection = java.sql.DriverManager.getConnection (databaseURL, user, password);
System.out.println ("Conexion establecida.");
}
catch (java.sql.SQLException e)
{
System.out.println ("Error al establecer la conexion.");
return;
}

// Deshabilitacion del autocommit
try
{
connection.setAutoCommit (false);
System.out.println ("Auto-commit deshabilitado.");
}
catch (java.sql.SQLException e)
{
System.out.println ("Error al deshabilitar el auto-commit.");
return;
}
}
finally
{
return;
}
}

/** Cierra la conexion a la base de datos*/
public void Close()
{
try
{
if (connection != null)
connection.close();
}
catch(java.sql.SQLException e)
{
System.out.println("No se pudo cerrar la conexion a la base de datos");
}
}
}


Espero q haya sido eso

Salu2!!!!!

P.D.: Conexion con INTERBASE desde JAVA usando Interclient ya q INTERBASE no soporta JDBC asi por q si y es por eso q existe INTERCLIENT. Ahora existe FIREBIRD q es open source y esta en sourceforge y anda mas rapido q INTERBASE

Salu2 otra vez!!!!!!!!

nicokiki
06 de Octubre del 2004
Hola de nuevo!!!!!!!

Lei en otro post q pedis q la conexion sea sicronizada. Bueno, podes hacer q el metodo connect (q deberia estar en castellano) sea asi:

private synchronized void connect() {....

y listo!!

Salu2!!!!!