2011-09-08 5 views
12

मिलीसेकंड में एक समय दिया गया है, हम निम्नलिखित स्निपेट का उपयोग कर XMLGregorianCalendar बना सकते हैं।XMLGregorianCalendar बनाने में डेटाटाइप फैक्टरी उपयोग बुरी तरह से प्रदर्शन करता है

GregorianCalendar greCal = new GregorianCalendar(); 
greCal.setTimeInMillis(timeInMilliseconds); 
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(greCal)); 

लेकिन समस्या यह है कि यह प्रदर्शन को बुरी तरह प्रभावित करता है।

http://www.java.net/node/666491

एक बग रवि के साथ इस के लिए दायर नहीं है, लेकिन वे किसी भी समाधान सूचीबद्ध नहीं किया है। http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6466177

किसी अन्य विकल्प की खोज करने की कोशिश की लेकिन व्यर्थ में। क्या आप में से किसी के पास ऐसा करने का विकल्प है?

धन्यवाद

रमन

उत्तर

11

महंगा हिस्सा DatatypeFactory.newInstance(), यह सही शीर्ष पर दिखाई देता है आवेदन की रूपरेखा है। हमारे मामले में हमने डेटाैटइप फैक्ट्री को स्थैतिक चर के रूप में संग्रहीत किया और हम दोहराए गए प्रारंभिकरण को बाधित करने में सक्षम थे। यह काम करना चाहिए क्योंकि हमारे द्वारा उपयोग किए जाने वाले डेटाटाइप फैक्ट्री कार्यान्वयन को थ्रेड सुरक्षित माना जाता है (जैसा कि बग रिपोर्ट में बताया गया है)। मैं मानता हूं कि एक मौका है कि यह लागू कार्यान्वयन के आधार पर बदल सकता है। तो मैं डबल चेक करने की सिफारिश करेंगे।

private static DatatypeFactory datatypeFactory; 
static{ 
    try { 
     datatypeFactory = DatatypeFactory.newInstance(); 
    } catch (DatatypeConfigurationException e) { 
     throw new RuntimeException("Init Error!", e); 
    } 
} 

public void foo(long timeInMilliseconds){ 
    GregorianCalendar greCal = new GregorianCalendar(); greCal.setTimeInMillis(timeInMilliseconds); 
    XMLGregorianCalendar xmlGregorienCalendar = datatypeFactory.newXMLGregorianCalendar(greCal); 
    // ... 
} 
+0

संभालने से बचने के लिए कि DatatypeFactory impl threadsafe एक ThreadLocal उपयोग करने पर विचार रहेगा करने का एक तरीका है: – Nikita

+6

सिद्धांत रूप में हाँ, लेकिन वर्तमान कार्यान्वयन threadsafe है, और करने के लिए किसी के ईमानदार हो इसे किसी भी थ्रेडसेफ बनाने के लिए काफी कठिन प्रयास करना होगा। (अगर केवल वही लड़का SimpleDateFormat लिखा है तो दुनिया एक खुश जगह होगी)। –

9

के बाद से @VivaceVivo उल्लेख किया DataFactory.newInstance() महंगा है और impl, धागे की सुरक्षा के लिए उपयोग करने पर विचार एक ThreadLocal इसकी गारंटी नहीं:

final private static ThreadLocal<DatatypeFactory> datatypeFactoryHolder = new ThreadLocal<DatatypeFactory>() 
    { 
     @Override 
     protected DatatypeFactory initialValue() 
     { 
      try 
      { 
       return DatatypeFactory.newInstance(); 
      } catch (DatatypeConfigurationException e) 
      { 
       throw new IllegalStateException("failed to create " + DatatypeFactory.class.getSimpleName(), e); 
      } 
     } 
    }; 

    public static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) 
    { 
     GregorianCalendar c = new GregorianCalendar(); 
     c.setTime(date); 
     return datatypeFactoryHolder.get().newXMLGregorianCalendar(c); 
    } 
} 

..as लंबे तुम नहीं के रूप में परवाह करता है, तो धागे एक अतिरिक्त वस्तु को कायम रखने में ThreadLocalMap समाशोधन जब जरूरत

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