Sesuai jawaban Byron, Anda tidak dapat mengatur networkaddress.cache.ttl
atau networkaddress.cache.negative.ttl
sebagai Properti Sistem dengan menggunakan -D
bendera atau memanggil System.setProperty
karena ini bukan properti Sistem - ini adalah properti Keamanan .
Jika Anda ingin menggunakan properti Sistem untuk memicu perilaku ini (sehingga Anda dapat menggunakan -D
bendera atau panggilan System.setProperty
), Anda perlu menyetel properti Sistem berikut :
-Dsun.net.inetaddr.ttl=0
Properti sistem ini akan mengaktifkan efek yang diinginkan.
Namun perlu diketahui: jika Anda tidak menggunakan -D
flag saat memulai proses JVM dan memilih untuk memanggil ini dari kode:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Kode ini harus dijalankan sebelum kode lain di JVM mencoba melakukan operasi jaringan.
Ini penting karena, misalnya, jika Anda memanggil Security.setProperty
file .war dan menerapkan .war ke Tomcat, ini tidak akan berhasil: Tomcat menggunakan tumpukan jaringan Java untuk menginisialisasi dirinya jauh lebih awal daripada kode .war Anda dieksekusi. Karena 'kondisi balapan' ini, biasanya lebih nyaman untuk menggunakan-D
bendera saat memulai proses JVM.
Jika Anda tidak menggunakan -Dsun.net.inetaddr.ttl=0
atau memanggil Security.setProperty
, Anda perlu mengedit $JRE_HOME/lib/security/java.security
dan menyetel properti keamanan tersebut dalam file itu, mis
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Tapi perhatikan peringatan keamanan di komentar seputar properti tersebut. Lakukan ini hanya jika Anda cukup yakin bahwa Anda tidak rentan terhadap serangan spoofing DNS .
java.security.Security
(setidaknya di jdk7)Java memiliki perilaku cache dns yang sangat aneh. Taruhan terbaik Anda adalah mematikan caching dns atau mengaturnya ke angka rendah seperti 5 detik.
sumber
System.getSecurityManager()
. Docs untuk Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Ini jelas telah diperbaiki dalam rilis yang lebih baru (SE 6 dan 7). Saya mengalami waktu caching maksimal 30 detik ketika menjalankan cuplikan kode berikut sambil menonton aktivitas port 53 menggunakan tcpdump.
sumber
Untuk memperluas jawaban Byron, saya yakin Anda perlu mengedit file
java.security
di%JRE_HOME%\lib\security
direktori untuk melakukan perubahan ini.Inilah bagian yang relevan:
Dokumentasi di
java.security
file di sini .sumber
Untuk meringkas jawaban lainnya,
<jre-path>/lib/security/java.security
Anda dapat mengatur nilai propertinetworkaddress.cache.ttl
untuk menyesuaikan bagaimana pencarian DNS di-cache. Perhatikan bahwa ini bukan properti sistem, tetapi properti keamanan. Saya dapat mengatur ini menggunakan:Ini juga dapat diatur oleh properti sistem
-Dsun.net.inetaddr.ttl
meskipun ini tidak akan menggantikan properti keamanan jika disetel di tempat lain.Saya juga ingin menambahkan bahwa jika Anda melihat masalah ini dengan layanan web di WebSphere, seperti yang saya lakukan sebelumnya, pengaturan
networkaddress.cache.ttl
tidak akan cukup. Anda perlu menyetel properti sistemdisableWSAddressCaching
ketrue
. Tidak seperti properti time-to-live, ini dapat disetel sebagai argumen JVM atau melaluiSystem.setProperty
).IBM memiliki posting yang cukup rinci tentang bagaimana WebSphere menangani caching DNS di sini . Bagian yang relevan di atas adalah:
sumber
Menurut properti java oracle resmi ,
sun.net.inetaddr.ttl
adalah properti implementasi khusus Sun, yang "mungkin tidak didukung dalam rilis mendatang". "cara yang disukai adalah dengan menggunakan properti keamanan"networkaddress.cache.ttl
.sumber