igo*_*lic 5 java oracle concurrency plsql
如果有人可以解释我如何正确配置plsql java包装器,当不同的数据库用户调用相同的过程来确保正确的并发资源访问处理时.
DBMS和JAVA:Oracle 10g,内部JavaVM 1.4.2
我有1个shema所有者的MyDatabse和10个用户连接的用户:
DBOWNER
DBUSER01
DBUSER02
...
DBUSER10
我有PL/SQL包装程序:my_package.getUser()包装UserHandler.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;
}
}
Run Code Online (Sandbox Code Playgroud)
包装器的想法是确保将外部信息系统用户名正确分发到与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中设置:
我的结论是,UserHandler类分别为每个DBUSER加载,这就是我没有使用静态计数器和同步方法的原因.
如何配置MyDatabase以强制调用my_package.getUser()为每个DBUSER使用相同的java空间?
非常感谢你!
我不认为有任何方法可以配置 Oracle 在多个用户会话之间共享 JVM。10g 的 Java 开发人员指南指出:
Oracle JVM 模型
即使成千上万的用户连接到服务器并运行相同的 Java 代码,每个用户的体验就好像他在自己的 JVM 上运行自己的 Java 代码一样......
通常,在 RDBMS 中的会话之间共享数据的适当方法是使用数据库对象。在这种情况下,最简单的方法是使用 Oracle 序列,最小值为 1,最大值为 10,并启用循环。您可以直接在 Java 代码中从序列中进行选择。
另一种方法是简单地生成 1 到 10 之间的均匀分布的随机数。如果有足够的会话,那么随着时间的推移,会话应该均匀分布。
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |