Home| New Wiki | | Login | User registry | Home Tree PDF
Administracion de secuencias
Owner:csilva, Version: 5, Date:Mon 15, November 2004,

Como asignar llaves primarias automáticamente ?

Existen varias opciones:

  • usar select max(llave)+1 from tabla
  • usar una secuencia de Oracle
  • usar una tabla de secuencias creada manualmente

Problemas

Opcion 1)

  • Dos procesos en paralelo entregarían la misma llave con una alta probabilidad.
  • No se puede pedir una llave para mostrarla en la pantalla antes de crear el dato ya que esto aumenta la probabilidad de que ocurra el punto 1.

Opcion 2)

  • Solo existe en Oracle, Sybase e Informix tienen columnas autoincrementadas, pero en Sybase la implementacion adolece de errores.
  • Hay al menos 2 formas de administrar las llaves: pedirla por anticipado y luego insertar la fila ó Insertar la fila con la secuencia y luego pedir al driver que retorne el ultimo id usado. la primera es lenta y la segunda es demasiado especifica para Oracle.

Opcion 3)

  • Requiere asegurar que dos transacciones serán bloqueadas antes de retornar el mismo Id.
  • Requiere mucho mas codigo.
  • Es lenta si se piden ids de uno en uno.

En resumen

1) no se puede usar nunca

2) no se puede usar sin oracle

3) Parece la mejor opcion si se programa con cuidado, pero requiere programar.

Implementacion del patrón SequenceBlocks

Entonces se puede usar un generador de llaves basado en una tabla de secuencias y que las pida por bloques de tamaño configurable, es decir, que pida 100 ids antes de empezar a entregarlas de manera de tener a mano algunas y que la entrega sea mas rápida.

CREATE TABLE sec_secuencias (
    sec_secuencia varchar(30) primary key,
    sec_siguiente integer
);

El uso de un API con que use este esquema puede ser como sigue:

 static SequenceManager sm = new SequenceManager(Constants.MAIN_DATASOURCE);
 public long getSecuencia(String seqName) throws SequenceException {
       long newId = sm.getNewId(seqName); 
       return newId;
 }

En este caso, el objeto SequenceManager DEBE ser almacenado globalemente. No puede haber varias copias en ejecución o el código no funcionará correctamente. Una opcion es usar una variable estatica (static) para crear el objeto SequenceManager.

static SequenceManager sm = new SequenceManager(Constants.MAIN_DATASOURCE);


Edit - History - Extract PDF - Extract Tree as PDF

Last Modified

Thu, Nov 19 Sat, Oct 3 Fri, Sep 25 Mon, Aug 3 Mon, Apr 27 Sat, Mar 28 Mon, Jan 19 Tue, Jan 6

Home| New Wiki