如果有人能解释当不同的数据库用户调用相同的过程以确保正确的并发资源访问处理时,如何正确配置plsql java包装器。
DBMS和JAVA: Oracle10g,内部JavaVM 1.4.2
我有一个shema所有者和10个db用户的MyDatabse可以连接到它:
DBOWNER
DBUSER01
DBUSER02
..。
DBUSER10
我有PL/SQL包装程序:包装UserHandler.getUser()的UserHandler.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;
}
} 包装器的思想是确保将外部信息系统用户名正确地分发给通过连接到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())。稍后,我将在2 maner中设置plsql包装器调用:
分离内存空间。
我的结论是为每个DBUSER分别加载UserHandler类,这就是为什么我没有使用静态计数器和同步方法的原因。
如何配置MyDatabase以强制对my_package.getUser()的调用对每个DBUSER使用相同的java空间?
非常感谢!
发布于 2011-03-03 14:00:52
我不认为有任何方法可以配置Oracle来在多个用户会话之间共享JVM。10g的Java开发人员指南指出:
Oracle模型
甚至当成千上万的用户连接到服务器并运行相同的Java代码时,每个用户都会体验到在自己的JVM上运行自己的Java代码.
通常,RDBMS中会话之间共享数据的适当方式是使用数据库对象。在这种情况下,最简单的方法是使用Oracle序列,并启用minvalue 1、maxvalue 10并启用循环。您可以直接在Java代码中从序列中进行选择。
另一种方法是简单地在1到10之间生成一个均匀分布的随机数,如果有足够的会话,那么随着时间的推移,这些会话的分布应该是均匀的。
https://stackoverflow.com/questions/5179566
复制相似问题