2011-05-05 40 views
4

我已經使用Apache commons-pool爲LDAP連接實現了一個池。我無法使用JNDI提供的池功能(http://download.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html),因爲我使用SSL連接(使用自定義(Oracle提供的)套接字工廠(java.naming.ldap.factory.socket env值集合)將上下文從JNDI池中取消限定)到LDAP服務器,因此即使設置了相應的池屬性,JNDI中的池設施也會自動禁用。什麼是最簡單(即最不復雜)的LDAP操作

現在談到池的實例InitialDirContext返回到池並需要檢查它是否仍然可用並且尚未被用戶關閉或丟失了到LDAP服務器的連接到其他原因。

這是我目前正在查找的DN已知的特定用戶的存在:

final InitialDirContext ctx = internalPooledLDAPConnection.getCtx(); 
final Subscriber sub = internalPooledLDAPConnection.getSub(); 

SearchControls ctls = new SearchControls(); 
ctls.setSearchScope(2); 
ctls.setReturningAttributes(new String[] { "dn"}); 
NamingEnumeration resultSet = ctx.search(sub.getUserSearchBase()[0], "(&(objectclass=*)(uid=orcladmin))", ctls); 

如果此操作不拋出任何異常,然後我的內部池LDAP連接內InitialDirContext仍然是可用並且可以安全地從池中重新使用。

但是,我想知道這是否是可以在這裏執行的'最便宜的'連接健全性檢查,或者是否存在我可以使用的更便宜的LDAP操作。

回答

3

LDAP比較操作可能比搜索更有效,因爲只有一個響應(搜索與條目匹配,您將有兩個響應 - 一個用於輸入,另一個用於指示搜索結果的結尾)。

但是,您可能還想考慮JNDI的替代方案,因爲它提供了一個衆所周知的用於LDAP的糟糕API。還有其他用於執行LDAP通信的Java庫比JNDI好得多。特別是,UnboundID LDAP SDK for Java(我是開發人員)爲LDAP通信提供了功能豐富,易於使用的高性能API。它具有豐富的連接池功能,包括健康檢查,故障轉移和負載平衡。請參閱http://www.unboundid.com/products/ldap-sdk/docs/advantages/comparison.php以比較UnboundID LDAP SDK與JNDI和Netscape Directory Java for Java提供的功能。

+0

謝謝您的建議。不幸的是我不能從JNDI切換到其他的東西,因爲我使用了一些Oracle JNDI LDAP連接的應用服務器庫。 – BertNase 2011-05-05 11:08:02

1

爲什麼不發送無效搜索未知或垃圾屬性。整個過程只是簡單地ping通,而不是實際的過程。

+0

試過了,沒有顯着差異(在操作的持續時間)找到一個存在的條目,但無論如何感謝。 – BertNase 2011-05-05 11:09:17

2

LDAP綁定就像您可以獲得的一樣簡單。這是JNDI中的reconnect()方法。

但是對於你在做什麼必須有所保留。如果通過SSL禁用共享池,則必須存在安全原因,因此您在設計自己的共享池時需要進行自己的安全分析。

+0

感謝您指出了潛在的安全問題 - 我會看看到它。 – BertNase 2011-05-05 11:10:29

2

我有類似的問題(我推出了自己的游泳池)。我的做法是期望任何彙集的連接都已經死亡。我讓我的池做兩次任何查詢:第一次它可能會失敗,所以重新連接並再試一次,但第二次嘗試失敗是真實的,並傳播。

總而言之,我沒有使用特定的ping查詢,而是讓應用程序自己的查詢充當潛在的ping。

只要最便宜的查詢,這可能是相當便宜!你可能甚至不需要爲這個綁定 - 我不記得了。

// The rootDSE attributes, Microsoft Active Directory 
Attributes attrs = ldapContext.getAttributes(""); 
String ldapRootDN = (String) attrs.get("rootDomainNamingContext").get(0); 
2

我們對控件0.0.0.0進行檢查。0這當然永遠不會存在來測試連接是否有效。我記得這是OpenLDAP(jldap)調用如何執行檢查。由於RootDSE的用於控制它通常,允許匿名,這將檢查是否連接好,但不檢查綁定狀態。

+0

對於發送0.0.0.0的JLDAP檢查僅檢測到服務器已關閉的連接,但它未檢測到由於服務器崩潰或網絡已關閉而導致掛起的連接。 – 2015-11-19 11:49:15

相關問題