2013-06-28 5 views
9

मुझे जेवीएम और डीएनएस के साथ समस्या का सामना करना पड़ रहा है।जेवीएम और ओएस डीएनएस कैशिंग

सब कुछ मैं (the docs और this सहित) पढ़ रहा हूँ कहना है कि मैं networkaddress.cache.ttl, जो java.security.Security.setProperties का उपयोग कर सेट किया जा सकता का उपयोग कर JVM DNS कैशिंग निष्क्रिय कर सकते हैं, लेकिन सिस्टम गुण का उपयोग करने का मानक दृष्टिकोण के माध्यम से। मैंने सफलतापूर्वक 0 को बदल दिया है, इसलिए मेरे जेवीएम में कैशिंग नहीं है।

लेकिन अब, InetAddress.getByName("mytest.com") की प्रत्येक कॉल पर, यह है कि मेरे JVM प्रणाली DNS कैश (मेरे मामले Windows 8 में) उपयोग कर रहा है लगता है। दरअसल, विधि के 2 कॉल के बीच, मैंने "mytest.com" के लिए BIND9 गुणों को बदल दिया है, लेकिन आईपी रिटर्न अभी भी वही है। मेरी जावा कोड में

  1. setCachePolicyInJVM(0): यहाँ कार्यप्रवाह है।
  2. mytest.com से 1 9 2.168.1 सेट करें। BIND9 में , पुनरारंभ करें।
  3. InetAddress.getByName("mytest.com").getHostAddress(); -> 1 9 2.168.1।
  4. सेट mytest.com -> 1 9 2.168.1। BIND9 में , पुनरारंभ करें।
  5. InetAddress.getByName("mytest.com").getHostAddress(); -> 1 9 2.168.1। (होना चाहिए यदि कोई कैशिंग नहीं था)।
  6. फ्लश विंडोज डीएनएस
  7. InetAddress.getByName("mytest.com").getHostAddress(); -> 192.168.1।

मैं कई बार पढ़ा है कि JVM सिस्टम कैश का उपयोग नहीं करता है, लेकिन यह गलत है: यह स्पष्ट रूप से नहीं करता है।

हम कैसे प्रत्येक कॉल पर एक नया DNS संकल्प मजबूर करते हैं, ओएस DNS कैश को दरकिनार?

+0

यह मेरे लिए भी उपयोगी होगा: मैं एक विफलता परिदृश्य के दौरान लोड बैलेंसर के दूसरी तरफ सभी आईपी पते का उपयोग करने के प्रयास में जेवीएम डीएनएस कैशिंग को अक्षम करने का प्रयास कर रहा हूं। चूंकि हम एक विफलता परिदृश्य में हैं, इसलिए मैं समय से पहले नए आईपी पते नहीं जान सकता, और यह भी स्पष्ट नहीं है कि नए आईपी पते ऑनलाइन कब आएंगे। तो मुझे हर बार होने के लिए वास्तव में DNS लुकअप की आवश्यकता होती है। –

उत्तर

3

मुझे लगता है कि मैंने इस समस्या में भाग लिया है, या एक बहुत ही समान है। मैंने जो किया वह JVM के लिए अपना स्वयं का DNS प्रदाता लागू करना था, विवरण के लिए how to change the java dns service provider देखें। आप वहां वर्णित dnsjava का उपयोग कर सकते हैं या अपना खुद का रोल कर सकते हैं।

+0

क्या आप "रूट" DNS सेवा प्रदाता को बदल सकते हैं? मैंने सोचा कि आप केवल नए प्रदाताओं को जोड़ सकते हैं जिन्हें पहले प्रदाता नकारात्मक होने पर बुलाया जाएगा। –

0

here से ऐसा लगता है कि आपको sun.net.inetaddr.ttl सेट करना चाहिए। यह मेरे लिए काम किया। लिंक से

उदाहरण:

java -Dsun.net.inetaddr.ttl=1 test 
Enter the hostname 
rrr 
Output isrrr/129.145.146.100 
Enter the hostname 
rrr 
Output isrrr/129.147.146.100 
+0

यह जावा 8 गुणों का भी उल्लेख किया गया है https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html#nct –

0

आप नीचे दिए गए संपत्ति जोड़ने के लिए अपने जावा 6-8 के लिए $JAVA_HOME/jre/lib/security/java.security और $JAVA_HOME/conf/security/java.security संपत्ति फ़ाइल को संपादित कर सकते हैं या तो।

networkaddress.cache.ttl=1 

यह कमांड लाइन में सेट करने के लिए उपलब्ध नहीं है।

चूंकि इन 2 गुण सुरक्षा नीति का हिस्सा हैं, वे नहीं हैं या तो डी विकल्प या System.setProperty() API द्वारा निर्धारित करते हैं, बजाय वे सुरक्षा लक्षणों के रूप में स्थापित कर रहे हैं।

इस संपत्ति को कोड के अंदर सेट करने के लिए, आप निम्न विधि का उपयोग कर सकते हैं।

java.security.Security.setProperty("networkaddress.cache.ttl", "1") 

या जावा कमांड लाइन में निम्न संपत्ति जोड़ें।

-Dnetworkaddress.cache.ttl=1 

यह भी ध्यान रखें कि मूल्यों प्रभावी केवल तभी इसी networkaddress.cache.* गुण सेट नहीं कर रहे हैं महत्वपूर्ण है।

अधिक जानकारी के लिए Java 8 Networking Properties, Java 9 Networking Properties और VeriSign DNS Caching in Java Virtual Machines देखें।

यह answer कुछ विवरण भी जोड़ता है।

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