2011-10-09 24 views
6

का उपयोग कर वेब ऐप सत्र प्रबंधन मेरी प्रोजेक्ट में मैं उपयोगकर्ता विवरण में लॉगग्ड स्टोर करने के लिए ehcache का उपयोग कर रहा हूं और कुछ अन्य जानकारी (कौन सा ऐप डीबी से लाने के बजाए रनटाइम पर इसका उपयोग करेगा)। निम्नलिखित मेरी ehcache विन्यास है:EHcache

<cache 
    name="normalCache" 
    maxElementsInMemory="50000" 
    eternal="false" 
    timeToIdleSeconds="1800" 
    timeToLiveSeconds="0" 
    overflowToDisk="false" 
    memoryStoreEvictionPolicy="LRU" 
/> 

लेकिन समस्या यह समय सत्र टाइमआउट हो रहा से ज्यादातर है (यहां तक ​​कि उपयोगकर्ता निष्क्रिय नहीं है और अधिक> 30)। कभी-कभी यह 10 मिनट के लिए हो रहा है, ...

सभी कार्य ehcache से प्रत्येक अनुरोध के लिए उपयोगकर्ता ऑब्जेक्ट को पुनर्प्राप्त करने का प्रयास करेंगे।

मुझे यकीन नहीं है कि ehcache समाप्ति समय निर्धारित करेगा।

+0

हाय Ramki मैं भी कोशिश कर रहा हूँ ehcache को लागू करने के लिए आपके पास कोई अच्छा दिशानिर्देश हो सकता है या उसके लिए ट्यूटोरियल यदि ऐसा है तो कृपया मुझे इसका लिंक प्रदान करें। –

+0

हाय आप किस एप्लिकेशन सर्वर का उपयोग कर रहे हैं? –

उत्तर

1

ehcache सभी आपके तत्वों को 30 मिनट के लिए रखने की गारंटी नहीं देता है।

आपकी कॉन्फ़िगरेशन में, आपके पास 50000 का अधिकतम एलिमेंट्स इनमेमरी है। हो सकता है कि आपके पास एक बिंदु पर 50000 तक पहुंच गया हो और इसलिए कम हाल ही में प्रयुक्त प्रविष्टि को निकाल दिया जाएगा क्योंकि आपने ओवरफ्लो टॉडिस्क को गलत पर सेट किया है।

5

ehcache कैश से वस्तुओं evicts जब निम्नलिखित शर्तों में से एक मुलाकात कर रहे हैं:

  1. वस्तु (पढ़ने के लिए या अद्यतन) ehcache से पहुँचा नहीं किया गया है और अधिक से अधिक timeToIdle सेकंड के लिए। यह नियम लागू नहीं होता है अगर timeToIdle सेट नहीं है। दूसरे शब्दों में, किसी ऑब्जेक्ट को अनंत समय के लिए कैश में रहने के लिए योग्यता प्राप्त होती है, भले ही इसे timeToIdle सेट न होने पर कैश से कभी भी उपयोग नहीं किया जाता (पढ़ा या अपडेट किया जाता है)।

  2. ऑब्जेक्ट timeToLive सेकंड से अधिक के लिए कैश में रहा है। यह नियम लागू नहीं होता है अगर timeToLive सेट नहीं है। दूसरे शब्दों में, एक वस्तु कैश में अनंत समय के लिए रहने के लिए योग्य है।

  3. कैश में आइटमों की संख्या maxElementsInMemory सीमा तक पहुंच गई है। उस स्थिति में memoryStoreEvictionPolicy क्रिया में आता है और निष्कासन नीति से मेल खाने वाले तत्वों को हटा देता है जब तक कि कैश में तत्वों की संख्या maxElementsInMemory सीमा से कम न हो जाए, भले ही वे आइटम कैश में शर्त संख्या 1 और संख्या 2 के अनुसार योग्य हों।

आशा है कि यह स्पष्ट करता है!

0

प्रस्तावना

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


क्यों ठीक है कोशिश करनी चाहिए। आप यह सुनिश्चित कर रहे हैं कि यह सही आसान तरीका न करें। यहां कुछ संकेत दिए गए हैं, आप सत्रों के लिए ehCache का उपयोग क्यों कर सकते हैं

  1. आपकी सेवा किसी उपयोगकर्ता सर्वर/वेब कंटेनर का हिस्सा नहीं है।
  2. आपकी सेवा स्टेटलेस है लेकिन समय-समय पर, आपको राज्यों (फ्रेमवर्क कोड) की आवश्यकता है।
  3. आप और अलग-अलग ग्राहक के बीच प्रॉक्सी की वजह से आप कॉल को अलग नहीं कर सकते हैं, उदाहरण के लिए आप किसी सेवा/सेवा के लिए किसी प्रकार का मिडलवेयर हैं जो डिफॉल्ट डेटा को डिफॉल्ट के रूप में प्रदान नहीं करता है, लेकिन उपयोगकर्ता आईडी या सत्र आईडी पैरामीटर का उपयोग करता है लेकिन गठबंधन नहीं ।
  4. आपने अभी आरटीएफएम नहीं किया है और इसे अपना रास्ता बनाना चाहते हैं।

1 के लिए कृपया जांचें, अगर जेटी जैसे वेब कंटेनर एक विकल्प है। आप निश्चित रूप से पूरे सत्र की वेब पहुंच का उपयोग करते हैं जो आपके लिए पॉप अप नहीं करेगा।

2 के लिए कृपया जांचें, अगर Apache Shiro आप जो चाहते हैं वह नहीं करेंगे। यदि नहीं, तो ehCache आपका मित्र हो सकता है।

3 के लिए ... क्लब में आपका स्वागत है।

4 के लिए ... अच्छा मुझे लगता है कि अगर आपने मैन्युअल नहीं पढ़ा है, तो आप इसे भी नहीं पढ़ पाएंगे।


कैसे आप उपयोग कर ehcache आश्वासन कृपया है कि आपके डेटा serializable है एक सत्र प्रबंधन लागू करना चाहते हैं

करने के लिए। यह समस्याओं को कम करेगा और आपको ehCache की संवेदनशील विशेषताओं का उपयोग करने देगा। अर्थात् डिस्क पर दृढ़ता, कैशिंग नोड्स, इससे पुनर्प्राप्त, और इसी तरह। सभी सत्रों के लिए

Do हर सत्र के लिए एक कैश का उपयोग नहीं है, लेकिन एक कैश। sessionId आपके कैश की कुंजी है, और एक मान Map पर जा रहे हैं। समरूपता के बारे में मत भूलना (AJAX कॉल के बारे में सोचें)। java.util.concurrent से ConcurrentHashMap का उपयोग करना सबसे अच्छा हो सकता है। लेकिन शायद आप Dr Heinz M. Kabutz हैं और इसे करने के लिए एक कूलर तरीका भी ढूंढें।

मुझे भंडारण में रखने के लिए तत्वों की मात्रा के बजाय आकार का उपयोग करने के लिए बहुत उपयोगी पाया गया। आपको पता नहीं हो सकता है कि बाद में कौन सा डेटा/objets संग्रहीत किया जाता है। एक दृढ़ता रणनीति निर्धारित करने के लिए मत भूलना। मैं यहाँ अस्थायी फ़ोल्डर में भंडारण का उपयोग किया।

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="true" 
    monitoring="autodetect" 
    dynamicConfig="true"> 

    <diskStore path="java.io.tmpdir"/> 

    <cache name="vocCache" 
     eternal="false" 
     maxElementsInMemory="100MB" 
     maxElementsOnDisk="1GB" 
    timeToIdleSeconds="3600" 
    timeToLiveSeconds="0" 
    memoryStoreEvictionPolicy="LRU" 
    diskExpiryThreadIntervalSeconds="60"> 
    <persistence strategy="localTempSwap" /> 
</cache> 

क्योंकि हम एक सत्र प्रबंधक लागू करना चाहते हैं, हम timeToLiveSeconds के बारे में परेशान नहीं है। एक निश्चित निष्क्रिय समय के बाद सत्र का समय समाप्त हो गया। इसलिए हम तत्व को अधिकतम ttl में बाध्य नहीं करते हैं, लेकिन तत्व को समय निकालने के लिए timeToIdleSeconds का उपयोग करें। timeToIdleSeconds और timeToLiveSeconds से परेशान न करें क्योंकि आप बाद में जोड़ने के लिए तत्वों को विशिष्ट मान सेट कर सकते हैं।

निष्कासन

एक समाप्ति समय पर ध्यान दें। एक कॉन्फ़िगर किए गए समय के कारण स्मृति में एक तत्व को कभी भी बेदखल नहीं किया जाएगा। मेमोरी तब तक बढ़ेगी जब तक परिभाषित मेमोरी बाधा हिट न हो जाए। इसलिए यदि आप 100 तत्वों को परिभाषित करते हैं, यदि 101 तत्व जोड़ा गया है, तो memoryStoreEvictionPolicy ट्रिगर होगा और एक तत्व होगा - इस कॉन्फ़िगरेशन में - डिस्क पर flushed (ehCache 2.2)। डिस्क संग्रहण के लिए, समाप्ति समय (diskExpiryThreadIntervalSeconds) के लिए एक थ्रेड जांच होगी। documentation देखें। इसलिए आपको यह सुनिश्चित करने के लिए isExpired() का उपयोग करके कैश से पुनर्प्राप्त तत्व को जांचना होगा कि यह समाप्त नहीं हुआ है।


तो अंत में, आप कुछ इस तरह से खत्म हो जाएगा:

प्राप्त

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME); 
Element elem = cache.get(identifier); 
if (elem == null) 
{ 
    throw new SessionNotFoundException(identifier); 
} 
if (elem.isExpired()) 
{ 
    throw new SessionExpiredException(identifier); 
} 

return elem.getObjectValue(); 

PUT

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME); 
// We use ttl = 0 and tti=<ttlInMinutes>, because session timeout is based on session idle timout. 
element = new Element(identifier, new SessionElement(), Boolean.FALSE, (int) (timeToLive/VALUE_MS), 0); 
cache.put(element); 

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

  • कोई संबंधित समस्या नहीं^_^