2012-08-20 11 views
6

उदाहरण के लिए मेरे पास डीबीएमनेजर.जावा सिंगलटन क्लास है, जिसे मुझे क्लस्टर पर्यावरण पर तैनात करना है। यह एक वेब आधारित अनुप्रयोग है, निम्नलिखित परिनियोजन stratergyएकाधिक जेवीएम समर्थन के लिए सिंगलटन जावा क्लास कैसे बनाएं?

अपाचे लोड बैलेंसर -> टॉमकैट 6 (क्लस्टर में 3 सर्वर)।

मुझे 3 टॉमकैट उदाहरणों के लिए डीबीमेनगर के एकल उदाहरण को बनाए रखना है।

मेरे कोड

package com.db.util; 
public class DBManager { 
    private static DBManager singleInstance; 
    private DBManager() {} 
    public static DBManager getSingleInstance() { 
     if (singleInstance == null) { 
      synchronized (DBManager.class) { 
       if (singleInstance == null) { 
        singleInstance = new DBManager(); 
       } 
      } 
     } 
     return singleInstance; 
    } 
} 

मैं इस समस्या का समाधान खोज रहे होते हैं, और JGroups API जैसी कोई चीज़ पाया जाता है। क्या यह जेग्रुप का उपयोग करके हासिल किया जा सकता है? कोई विचार, इसे कैसे कार्यान्वित करें?

+2

यदि सवाल यह है कि क्या आपके पास JVMs में सिंगलटन हो सकता है, तो मुझे नहीं लगता कि यह संभव है। – dfb

+0

मुझे 3 टॉमकैट उदाहरणों के लिए डीबीमेनगर के एकल उदाहरण को बनाए रखना है। –

+0

क्या आप सिंगलटन ईजेबी की तरह कुछ ढूंढ रहे हैं? –

उत्तर

5

जावा आपको प्रत्येक उदाहरण में एक सिंगलटन देता है, तो आपको किसी भी समय किसी भी समय सक्रियता के बीच समन्वय की आवश्यकता होती है, लेकिन यदि सक्रिय व्यक्ति मर जाता है तो एक अलग उदाहरण सक्रिय हो जाता है।

कुछ ऐप सर्वर इस तरह के समन्वित कार्यकर्ता उदाहरणों को नियंत्रित करने के लिए क्षमताओं में निर्मित हैं, मुझे नहीं पता कि टॉमकैट का ऐसा कोई कार्य है या नहीं।

ऐसी कार्यक्षमता बनाना स्वयं आश्चर्यजनक रूप से कठिन है, this question देखें और ध्यान दें कि वह प्रश्न उपयोगी पुस्तकालय के लिंक प्रदान करता है - जो मुझे उपयोग करने के लिए काफी जटिल लगता है।

हालांकि आपके मामले में आपके पास डेटाबेस है, और यह आपको समन्वय का एक बिंदु देता है। मैंने इसे विस्तार से डिज़ाइन नहीं किया है, लेकिन मुझे लगता है कि एक नियंत्रण तालिका में एक समर्पित पंक्ति का उपयोग करके आरक्षण योजना बनाना संभव है। यह प्रभावी ढंग से करने के लिए थोड़ा मुश्किल होगा, डेटाबेस को मतदान करने के ऊपरी हिस्से के साथ एक उदाहरण मौत की पहचान की गति को संतुलित करना, यह देखने के लिए कि कौन सा उदाहरण सक्रिय है, लेकिन ऐसा लगता है।

विचार यह है कि रिकॉर्ड में "आरक्षित" टाइमस्टैम्प और "प्रक्रिया आईडी" शामिल है। प्रत्येक प्रक्रिया रिकॉर्ड को पढ़ती है, अगर इसमें अपनी आईडी है और टाइमस्टैम्प अभी तक समाप्त नहीं हुआ है, तो यह जानता है कि यह काम कर सकता है। जब समय लगभग समाप्त हो जाता है, तो सक्रिय प्रक्रिया दौड़ की स्थितियों को प्रबंधित करने के लिए आशावादी लॉकिंग शैली का उपयोग करके टाइमस्टैम्प अपडेट करती है "अपडेट करें जहां टाइमस्टैम्प == पुराना टाइमस्टैम्प"। प्रत्येक गैर सक्रिय प्रक्रिया तब तक प्रतीक्षा करती है जब तक कि आखिरी बार पढ़ने वाले टाइमस्टैम्प की समयसीमा समाप्त नहीं हो जाती है और फिर रिकॉर्ड को अपडेट करके नियंत्रण लेने का प्रयास किया जाता है, फिर एक आशावादी लॉकिंग अपडेट का उपयोग करके। आम तौर पर नियंत्रण लेने का प्रयास विफल हो जाएगा, लेकिन अगर यह सफल होता है तो अब हमारे पास एक नया सक्रिय उदाहरण है, और आशावादी लॉकिंग के कारण हम केवल एक सक्रिय उदाहरण प्राप्त कर सकते हैं।

+0

यह ध्यान देने योग्य है कि एसीआईडी ​​गारेनटेस को आश्वस्त नहीं होने पर आशावादी लॉकिंग काम नहीं करती है (उदाहरण के लिए जब डेटाबेस डेटासेंटर भर में दोहराया जाता है) –

0

सिंगलटन किसी दिए गए जेवीएम में कक्षा का केवल एक उदाहरण सुनिश्चित करता है।

एकाधिक डीबीएमनेजर्स के साथ क्या समस्या है, प्रत्येक आपके JVM के लिए, आपके मामले में?

संबंधित मुद्दे