Generación segura del número de orden secuencial que se restablece diariamente

Tengo el requisito de generar números de pedido en el formato aaaaMMddxxxxxx donde xxxxxx es el número de pedidos desde la medianoche.

Por ejemplo, 20120821000004 es el cuarto pedido el 21 de agosto de 2012. Se pueden crear hasta 5 pedidos por segundo, por lo que esta es una consideración de rendimiento.

Una solución obvia es hacer algo como lo siguiente para encontrar el último orden de incremento:

SELECT MAX (id) FROM table_name WHERE id LIKE '2012-08-21%'

Pero es probable que se encuentre con problemas de rendimiento.

La otra opción que he explorado es crear una secuencia que se usa para controlar el componente de número y usar un activador de inserción. El problema con ese enfoque es que necesita alguna forma segura de pasar la secuencia a cero al comienzo del día, lo que podría causar colisiones / condiciones de carrera si la secuencia no se restablece exactamente a la medianoche.

¿Hay algún truco que pueda usar aquí con Oracle para hacerlo hermético pero también efectivo?

Respuesta 1

Si solo va a hacer esto en SQL sin ninguna utilidad externa, podría mantener dos tablas:

  • ID de orden absoluta
  • Fecha / orden de compensación

La primera tabla se utilizará para producir valores de identificación únicos y monotónicamente crecientes. La segunda tabla se usará para rastrear el desplazamiento diario desde la primera tabla hasta la ID diaria. Se insertará una fila en el primer orden del día y sería la fecha y la ID más alta de la primera tabla. La ID de la orden puede calcularse restando la compensación de ID en la segunda tabla de la nueva ID extraída de la primera tabla.

Puede considerar realizar un seguimiento interno de las órdenes en la base de datos utilizando la ID de orden absoluta entera y simplemente usando los datos de fecha / desplazamiento para producir la información de fecha humana y el número de orden diario sobre la marcha o como referencia cruzada.

Respuesta: 2

podrías generar una nueva secuencia para cada nuevo día. darles un nombre significativo como 'order_seq_20120821'.

  • comprobar si existe la secuencia para hoy
  • si no lo crea (maneje la concurrencia aquí, otro hilo podría haberlo creado)
  • entonces úsalo

No es realmente una pregunta de Java aquí, el cliente no puede manejar la concurrencia de la base de datos

Respuesta: 3

Esta no es específicamente una solución de Oracle, pero estoy pensando en tener una tabla de números de pedido con tres columnas: fecha, xxxxxx (como int) y el número de pedido.

Mantenga un índice en (fecha, xxxxxxx). Ahora, haga la consulta como:

select max(id) from OrderNumbers where date = <date>

Esto usará el índice y debería acelerar las operaciones.

Otra idea es mantener una tabla similar, pero solo para la fecha actual. En esta versión, tendrías una columna de secuencia / incremento automático que genera automáticamente xxxxxx. Luego puede usar un disparador para calcular el número de pedido y recuperar el último valor insertado para crear el nuevo número de pedido. Este podría ser el método más rápido, especialmente si considera el problema de bloquear los datos.

Respuesta: 4

Sé que siempre puedo atrapar excepciones en try / catch block y throw Exception (mensaje, e) como este try {//...my code arrojando alguna excepción} catch (IndexOutOfBoundsException e) {...

Un conductor de uno de nuestros proveedores de repente comenzó a fallar la semana pasada, en una máquina donde ha funcionado durante casi un año. Los últimos dos mensajes descriptivos emitidos por el controlador ahora son tres minutos ...

Básicamente, solo estoy tratando de abrir automáticamente una etapa cada segundo tan pronto como se inicia el programa. Iba a continuar por esta ruta mientras tenía varias líneas de tiempo que usan diferentes ...

Estoy tratando de escribir un código donde seleccione dos nodos y cree una o varias conexiones entre ellos. El problema es que solo puedo crear una conexión, la conexión consiste en un borde y un ...