如果不同的数据库用户调用相同的过程来确保正确的并发资源访问处理,有人可以解释我如何正确配置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将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 Client Application连接到MyDatabase的DBUSERS。
我的问题是,当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测试中确认的那样,多个并发线程调用UserHandler.getUser())。 后来我发红了plsql包装器调用可以在2个maner中设置:
我的结论是,每个DBUSER分别加载UserHandler类,这就是我没有使用静态计数器和同步方法的原因。
如何配置MyDatabase以强制调用my_package.getUser()为每个DBUSER使用相同的java空间?
非常感谢!
答案 0 :(得分:2)
我不相信有任何方法可以配置Oracle在多个用户会话之间共享JVM。 Java Developer's Guide for 10g声明:
Oracle JVM模型
即使有数千名用户连接 到服务器并运行相同的Java 代码,每个用户都会体验它 他正在运行他自己的Java代码 拥有JVM ......
通常,在RDBMS中的会话之间共享数据的适当方法是使用数据库对象。在这种情况下,最简单的方法是使用Oracle序列,启用minvalue 1,maxvalue 10和循环。您可以直接在Java代码中从序列中进行选择。
另一种方法是简单地生成1到10之间的均匀分布的随机数。如果有足够的会话,那么随着时间的推移,这应该均匀地分配会话。