Если кто-то может объяснить мне, как правильно настроить упаковщик Java plsql, когда разные пользователи базы данных вызывают одну и ту же процедуру для обеспечения правильной обработки одновременного доступа к ресурсам.
СУБД и JAVA: Oracle 10g, внутренний JavaVM 1.4.2
У меня есть MyDatabse с 1 владельцем Shema и 10 дБ пользователей, которым разрешено подключаться к нему:DBOWNERDBUSER01DBUSER02...DBUSER10
У меня есть процедура оболочки PL / SQL: my_package.getUser (), которая обертывает UserHandler.getUser ()
У меня есть Java-класс UserHandler, загруженный в MyDatabase с помощью 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;
}
}
Идея оболочки заключается в том, чтобы обеспечить правильное распределение имен пользователей внешней информационной системы для DBUSERS, подключенных к MyDatabase с клиентским приложением Oracle Forms.
Моя проблема заключается в том, что когда 5 пользователей одновременно вызывают процедуру my_package.getUser () Iполучил:
DBUSER01 - вызов my_package.getUser () вернул EIS_ORA_200DBUSER02 - вызов my_package.getUser () вернул EIS_ORA_200DBUSER03 - вызов my_package.getUser () вернул EIS_ORA_200DBUSER04 - вызов my_package.getUser () вернул EIS_ORA_200DBUSER05 - вызов my_package.getUser () вернул EIS_ORA_200
Я ожидал, что каждый DBUSER получит своего пользователя (как я подтвердил в моих тестах JUnit, где несколько параллельных потоков вызывают UserHandler.getUser ()).Позже я заметил, что вызовы-оболочки plsql могут быть настроены в 2 режима:
- для разделения пространства памяти Java между DBUSERS или
- для разделения пространства памяти для каждого DBUSER
Мой вывод таков: класс UserHandler загружается для каждого DBUSER отдельно, поэтому я не использую статический счетчик и синхронизированный метод.
Как настроить MyDatabase для принудительного вызова my_package.getUser () использовать одинаковое пространство Java для каждого DBUSER?
Большое спасибо!