[英]How to setup concurrent calls in Oracle 10g Java VM
如果有人可以解釋我如何正確配置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;
}
}
包裝器的想法是確保將外部信息系統用戶名正確分發到與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。 Java開發人員指南10g指出:
Oracle JVM模型
即使成千上萬的用戶連接到服務器並運行相同的Java代碼,每個用戶都會體驗它,就像他在自己的JVM上運行自己的Java代碼一樣......
通常,在RDBMS中的會話之間共享數據的適當方法是使用數據庫對象。 在這種情況下,最簡單的方法是使用Oracle序列,啟用minvalue 1,maxvalue 10和循環。 您可以直接在Java代碼中從序列中進行選擇。
另一種方法是簡單地生成1到10之間的均勻分布的隨機數。如果有足夠的會話,那么隨着時間的推移,這應該均勻地分配會話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.