同樣的一段代碼,在我的機(jī)器上是OK的,在測(cè)試環(huán)境也是OK的。就是到了新來(lái)的同事機(jī)器上,那叫一個(gè)慢啊。輸入用戶名口令,登錄,需要等待1分鐘……
初步判斷肯定是LdapTemplate做操作的時(shí)候花費(fèi)了很長(zhǎng)的時(shí)間。LdapTemplate的配置如下:
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldap://192.168.1.77:389/dc=cn,dc=earth"/>
<property name="userDn" value="cn=root"/>
<property name="password" value="tjmc123"/>
</bean>
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<property name="contextSource" ref="contextSource"/>
</bean>
但是還是看不出問(wèn)題。實(shí)在是百思不得其解了,只好查看Thread dump了,在這里花費(fèi)了很長(zhǎng)的時(shí)間:
"qtp22172629-23" prio=5 tid=0x1741d1d0 nid=0x1760 runnable [0x17f9e000..0x17f9fd68]
at java.net.Inet4AddressImpl.getHostByAddr(Native Method)
at java.net.InetAddress$1.getHostByAddr(InetAddress.java:842)
at java.net.InetAddress.getHostFromNameService(InetAddress.java:532)
at java.net.InetAddress.getHostName(InetAddress.java:475)
at java.net.InetAddress.getHostName(InetAddress.java:447)
at java.net.InetSocketAddress.getHostName(InetSocketAddress.java:210)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:341)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at java.net.Socket.(Socket.java:365)
at java.net.Socket.(Socket.java:178)
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:346)
......
看起來(lái),是在嘗試解析主機(jī)域名/地址信息。可是我配置的是IP地址啊,為啥還去解析?先不管這些了,先在本地hosts文件中配置一下LDAP服務(wù)器的別名吧。配置完本地hosts文件之后,測(cè)試,一切OK了。
回想起來(lái),因?yàn)槲业臋C(jī)器和測(cè)試環(huán)境應(yīng)用主機(jī)上都有LDAP服務(wù)器的別名配置,所以沒(méi)有出現(xiàn)連接慢的問(wèn)題,而新來(lái)的同事的hosts文件是干干凈凈的,所以,杯具了……
//------------------------------------
分析了Spring-ldap的代碼以及關(guān)鍵的類(lèi)InetSocketAddress,過(guò)程大概是這樣的:
spring-ldap的LdapContextSource會(huì)把設(shè)置的屬性u(píng)rl的值中,ldap://和端口之間的字符串當(dāng)做主機(jī)名(注意,是當(dāng)做主機(jī)名,是String對(duì)象,不是地址)傳入給LdapClient去建立和LDAP服務(wù)器之間的連接。而LdapClient通過(guò)層層調(diào)用之后,最終通過(guò)構(gòu)造器InetSocketAddress(String hostname, int port) 創(chuàng)建了InetSocketAddress對(duì)象。
在JDK的文檔上關(guān)于InetSocketAddress(String hostname, int port)有如下描述:
Creates a socket address from a hostname and a port number.
An attempt will be made to resolve the hostname into an InetAddress. If that attempt fails, the address will be flagged as unresolved.
無(wú)需再解釋什么了……
回頭想想,介紹spring-ldap的文章也好,示例代碼也好,基本上都是在url上寫(xiě)域名,很少見(jiàn)寫(xiě)地址的,看來(lái),spring-ldap是鄙視IP地址的方式訪問(wèn)LDAP服務(wù)器的了。
環(huán)境列表:
Sun HotSpot JDK 1.5.0_05
Spring-ldap: 1.3.0
Spring: 3.0.4
Technorati 標(biāo)簽:
Spring,
LdapTemplate,
LDAP
posted on 2012-02-29 16:41
YODA 閱讀(4035)
評(píng)論(0) 編輯 收藏