Tengo una aplicación Java distribuida que se ejecuta en 5 servidores de aplicaciones. Todos los servidores usan la misma base de datos Oracle 9i que se ejecuta en una sexta máquina.Cómo recuperar previamente las ID de secuencia de Oracle en un entorno distribuido
La aplicación necesita recuperar previamente un lote de 100 ID de una secuencia. Es relativamente fácil de hacer en un entorno de un solo subproceso, no distribuido, sólo puede emitir estas consultas:
select seq.nextval from dual;
alter sequence seq increment by 100;
select seq.nextval from dual;
El primero seleccione Obtiene la primera secuencia ID que la aplicación puede utilizar, el segundo select regrese el último uno que se puede usar
Las cosas se ponen mucho más interesantes en un entorno multiproceso. No puede estar seguro de que antes de que el segundo seleccione otro hilo no aumente la secuencia en 100 nuevamente. Este problema se puede resolver sincronizando el acceso en el lado de Java: solo permite que un hilo comience a buscar los ID a la vez.
La situación se vuelve realmente difícil cuando no se puede sincronizar porque partes de la aplicación no se ejecutan en la misma JVM, ni siquiera en la misma máquina física. Encontré algunas referencias en los foros que otros tienen problemas para resolver este problema también, pero ninguna de las respuestas funciona realmente sin mencionar que es razonable.
¿Puede la comunidad proporcionar una solución para este problema?
Algunos más información:
- Realmente no puedo jugar con los niveles de aislamiento de transacción. Utilizo JPA y el cambio afectaría a toda la aplicación, no solo a las consultas de recuperación previa y eso no es aceptable para mí.
En PostgreSQL que podía hacer lo siguiente:
seleccione setval ('SEC', nextval ('SEC') + n - 1)
La solución por Matthew funciona cuando se puede utilizar un fijo valor de incremento (que es perfectamente aceptable en mi caso). Sin embargo, ¿existe una solución cuando no desea corregir el tamaño del incremento, pero desea ajustarlo dinámicamente?
Gran respuesta: o) – Andrew