Как настроить одновременные вызовы в Oracle 10g Java VM - PullRequest
5 голосов
/ 03 марта 2011

Если кто-то может объяснить мне, как правильно настроить упаковщик 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 режима:

  1. для разделения пространства памяти Java между DBUSERS или
  2. для разделения пространства памяти для каждого DBUSER

Мой вывод таков: класс UserHandler загружается для каждого DBUSER отдельно, поэтому я не использую статический счетчик и синхронизированный метод.

Как настроить MyDatabase для принудительного вызова my_package.getUser () использовать одинаковое пространство Java для каждого DBUSER?

Большое спасибо!

1 Ответ

2 голосов
/ 03 марта 2011

Я не верю, что есть способ настроить Oracle для совместного использования JVM между несколькими пользовательскими сеансами. Руководство разработчика Java для 10g гласит:

Модель Oracle JVM

Даже когда тысячи пользователей подключаются на сервер и запустить ту же Java код, каждый пользователь испытывает это, как будто он запускает свой собственный код Java на своем собственная JVM ...

Как правило, подходящим способом обмена данными между сеансами в СУБД является использование объектов базы данных. В этом случае проще всего использовать последовательность Oracle с минимальным значением 1, максимальным значением 10 и циклическим включением. Вы можете просто выбрать из последовательности непосредственно в коде Java.

Другой подход заключается в простом генерировании равномерно распределенного случайного числа между 1 и 10. Если сеансов достаточно, то со временем это должно равномерно распределить сеансы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...