加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 13:15:27 所属栏目:百科 来源:网络整理
导读:如果有人可以解释我如何正确配置plsql java包装器,当不同的数据库用户调用相同的过程来确保正确的并发资源访问处理时. DBMS和JAVA:Oracle 10g,内部JavaVM 1.4.2 我有一个拥有1个shema所有者的MyDatabse和10个用户连接的用户: 的dbowner DBUSER01 DBUSER02
如果有人可以解释我如何正确配置plsql java包装器,当不同的数据库用户调用相同的过程来确保正确的并发资源访问处理时.

DBMS和JAVA:Oracle 10g,内部JavaVM 1.4.2

我有一个拥有1个shema所有者的MyDatabse和10个用户连接的用户:
的dbowner
DBUSER01
DBUSER02

DBUSER10

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

我用loadjava上传到MyDatabase的java类UserHandler:

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 Client Application连接到MyDatabase的DBUSERS.

我的问题是,当5个用户完全调用过程my_package.getUser()时,我得到了:

DBUSER01 – call to my_package.getUser() returned EIS_ORA_200
DBUSER02 – call to my_package.getUser() returned EIS_ORA_200
DBUSER03 – call to my_package.getUser() returned EIS_ORA_200
DBUSER04 – call to my_package.getUser() returned EIS_ORA_200
DBUSER05 – call to my_package.getUser() returned EIS_ORA_200

我被期望每个DBUSER会得到不同的用户(因为我在我的JUnit测试中确认多个并发线程调用UserHandler.getUser()).
后来我发红了plsql包装器调用可以在2个maner中设置:

>在DBUSERS或之间共享java内存空间
>为每个DBUSER分隔内存空间

我的结论是,UserHandler类分别为每个DBUSER加载,这就是我没有使用静态计数器和同步方法的原因.

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

非常感谢你!

解决方法

我不相信有任何方法可以配置Oracle在多个用户会话之间共享JVM. Java开发人员指南10g指出:

Oracle JVM model

Even when thousands of users connect
to the server and run the same Java
code,each user experiences it as if
he is running his own Java code on his
own JVM…

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读