1.方法概述
这个方法会返回这个对象所表示的域名/机器名
如果刚开始构造的时候用的就是域名/机器名, 会直接返回这个
如果刚开始用的是IP来构造这个对象, 则会用DNS反向解析来找到对应的域名/机器名
2.问题
问题就在于DNS的反向解析, 如果解析不成功, 它会一直尝试, 大概10秒的时间, 所以这10秒是阻塞的.
如果使用到这个方法的时候, 特别是一些网络编程, 要注意考虑阻塞的情况.
3.案例
在项目中有用到spring继承MongoDB的时候, 有遇到这个问题, 启动的时候特别慢
原因就是在连接MongoDB的时候, 调用了getHostName()这个方法.
解决方案
在hosts文件中增加IP映射
注意这里的映射两边都是相同的IP, 即直接把这个IP作为域名去映射
4.总结
MongoDB的这个做法引发了我的思考:
实际上就算是不获取主机名/域名, 直接用IP也是可以进行网络连接的, 那为什么它要获取主机名/域名, 目的无非是后面用主机名/域名去进行网络连接, 那么用域名去进行网络连接有什么好处吗?
我能想到的是2点:
- 域名对于服务器的迁移来说会更加平滑, 因为IP变化不影响客户端的配置
- 域名更适合做一些负载均衡或者CDN的策略
另外, 还有一个问题:
DNS的反向解析为什么会不成功?
这个我查了一些资料, 感觉影响的因素可能有以下几点:
- 操作系统的限制(防火墙之类的)
- 本地的网络配置(包括IP, 网关, DNS等)
- 局域网网关的网络配置
当然我也只是说可能, 并没有深入研究, 有研究的可以告知我.