sirve que propiedades para metodos event change java oracle concurrency plsql

que - propiedades slider java



Cómo configurar llamadas simultáneas en Oracle 10g Java VM (1)

No creo que haya ninguna forma de configurar Oracle para compartir una JVM entre varias sesiones de usuario. La Guía del desarrollador de Java para 10g afirma:

Modelo Oracle JVM

Incluso cuando miles de usuarios se conectan al servidor y ejecutan el mismo código Java, cada usuario lo experimenta como si estuviera ejecutando su propio código Java en su propia JVM ...

En general, la forma adecuada de compartir datos entre sesiones en un RDBMS es con objetos de base de datos. En este caso, lo más simple sería usar una secuencia de Oracle, con minvalue 1, maxvalue 10 y ciclismo habilitado. Puede simplemente seleccionar de la secuencia directamente en el código de Java.

Otro enfoque sería simplemente generar un número aleatorio distribuido uniformemente entre 1 y 10. Si hay suficientes sesiones, con el tiempo esto debería distribuir las sesiones de manera uniforme.

Si alguien puede explicarme cómo configurar adecuadamente la envoltura de plsql java cuando diferentes usuarios de la base de datos invoquen el mismo procedimiento para garantizar el correcto manejo concurrente del acceso a los recursos.

DBMS y JAVA: Oracle 10g, JavaVM interno 1.4.2

Tengo MyDatabse con 1 propietario de shema y 10 usuarios de db para conectarse:
DBOWNER
DBUSER01
DBUSER02
...
DBUSER10

Tengo el procedimiento de contenedor PL / SQL: my_package.getUser () que wrapps UserHandler.getUser ()

Tengo UserHandler de clase java cargado en MyDatabase con loadjava:

public class UserHandler { private static final int MAX_USER_COUNT = 10; private static final String USERNAME_TEMPLATE = "EIS_ORA_20"; private static int currentUserSeed = 0; /** * Generates EIS user according to pattern agreed by EIS developers. It * circles user pool with round-robin method ensuring concurrent calls. * * @return valid EIS USERNAME */ synchronized public static String getUser() { String newUser = USERNAME_TEMPLATE + currentUserSeed; currentUserSeed++; currentUserSeed = currentUserSeed % MAX_USER_COUNT; return newUser; } }

La idea de wrapper es garantizar la distribución adecuada de los nombres de usuario del sistema de información externo a DBUSERS conectados a MyDatabase con Oracle Forms Client Application.

Mi problema es que cuando 5 usuarios llamaron concurentemente al procedimiento my_package.getUser () obtuve:

DBUSER01 - call to my_package.getUser () devuelto EIS_ORA_200
DBUSER02 - call to my_package.getUser () devuelto EIS_ORA_200
DBUSER03 - call to my_package.getUser () devuelto EIS_ORA_200
DBUSER04 - call to my_package.getUser () devuelto EIS_ORA_200
DBUSER05: la llamada a my_package.getUser () devolvió EIS_ORA_200

Se esperaba que cada DBUSER obtuviera un usuario diferente (como lo confirmé en mis pruebas JUnit donde múltiples subprocesos concurrentes invocan UserHandler.getUser ()). Más tarde tengo rojo que las llamadas de contenedor plsql se pueden configurar en 2 maner:

  1. para compartir espacio de memoria Java entre DBUSERS o
  2. para separar el espacio de memoria para cada DBUSER

Mi conclusión es que la clase UserHandler se carga para cada DBUSER por separado y es por eso que no tengo uso de contador estático y método sincronizado.

¿Cómo configurar MyDatabase para forzar las llamadas a my_package.getUser () use el mismo espacio de Java para cada DBUSER?

¡Muchas gracias!