如何在Oracle 10g Java VM中设置并发调用

如何在Oracle 10g Java VM中设置并发调用,java,oracle,concurrency,plsql,Java,Oracle,Concurrency,Plsql,如果有人能告诉我,当不同的数据库用户调用相同的过程以确保正确的并发资源访问处理时,如何正确配置PLSQLJava包装器 DBMS和JAVA:Oracle10g,内部JavaVM1.4.2 我有一个拥有1个shema所有者和10个db用户的MyDatabase,可以连接到它: 数据库所有者 DBUSER01 DBUSER02 … DBUSER10 我有PL/SQL包装程序: wrapps UserHandler.getUser()的my_package.getUser()包 我已使用loadjav

如果有人能告诉我,当不同的数据库用户调用相同的过程以确保正确的并发资源访问处理时,如何正确配置PLSQLJava包装器

DBMS和JAVA:Oracle10g,内部JavaVM1.4.2

我有一个拥有1个shema所有者和10个db用户的MyDatabase,可以连接到它:
数据库所有者
DBUSER01
DBUSER02

DBUSER10

我有PL/SQL包装程序: wrapps UserHandler.getUser()的my_package.getUser()包

我已使用loadjava将java类UserHandler上载到MyDatabase:

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;    
    }    
}    
包装器的思想是确保将外部信息系统用户名正确分发给使用Oracle Forms客户端应用程序连接到MyDatabase的数据库用户

我的问题是,当5个用户同时调用过程My_package.getUser()时,我得到:

DBUSER01-调用my_package.getUser()返回EIS_ORA_200
DBUSER02-调用my_package.getUser()返回EIS_ORA_200
DBUSER03-调用my_package.getUser()返回EIS_ORA_200
DBUSER04-调用my_package.getUser()返回EIS_ORA_200
DBUSER05-调用my_package.getUser()返回EIS_ORA_200

我期望每个DBUSER会得到不同的用户(正如我在JUnit测试中确认的那样,在JUnit测试中,多个并发线程调用UserHandler.getUser()。 稍后,我发现plsql包装器调用可以在2个maner中设置:

  • 在数据库用户之间共享java内存空间或
  • 为每个DBUSER分隔内存空间
  • 我的结论是,UserHandler类分别为每个DBUSER加载,这就是我不使用静态计数器和同步方法的原因

    如何配置MyDatabase以强制调用my_package.getUser()为每个DBUSER使用相同的java空间


    多谢各位

    我认为没有任何方法可以将Oracle配置为在多个用户会话之间共享JVM。《10g Java开发人员指南》指出:

    Oracle JVM模型

    即使有成千上万的用户连接 连接到服务器并运行相同的Java 代码,每个用户都会体验到 他正在自己的计算机上运行自己的Java代码 自己的JVM

    通常,在RDBMS中,在会话之间共享数据的适当方式是使用数据库对象。在这种情况下,最简单的方法是使用Oracle序列,启用minvalue 1、maxvalue 10和循环。您可以直接在Java代码中从序列中进行选择


    另一种方法是简单地生成1到10之间的均匀分布随机数。如果有足够的会话,那么随着时间的推移,这应该会平均分配会话。

    有趣的问题,但是有什么原因不能使用pl/sql函数并将当前用户种子存储在表中吗?oracle开发人员拒绝用以下逻辑污染20年前的表模式:)最后,我们使用了一行表。每个用户读取行以进行更新,增加表中的种子值和更新值。