連線池支援
透過連線池處理 LDAP 連線有助於減輕每次 LDAP 互動建立新 LDAP 連線的開銷。Java LDAP 連線池支援雖然存在,但其配置選項和功能有限,例如連線驗證和池維護。Spring LDAP 支援對每個 ContextSource 進行詳細的池配置。
透過在應用程式上下文配置中為 <ldap:context-source /> 元素提供一個 <ldap:pooling /> 子元素來提供連線池支援。只讀和讀寫 DirContext 物件是單獨池化的(如果指定了 anonymous-read-only)。Jakarta Commons-Pool 用於提供底層的池實現。
DirContext 驗證
池化連線的驗證是使用自定義連線池庫而非 JDK 提供的 LDAP 連線池功能的主要動機。驗證允許在從池中取出、存入池中或在池中空閒時,檢查池化的 DirContext 連線,以確保它們仍然正確連線和配置。
如果配置了連線驗證,則使用 DefaultDirContextValidator 驗證池化連線。DefaultDirContextValidator 執行 DirContext.search(String, String, SearchControls),其空名稱、過濾器為 "objectclass=*",並且 SearchControls 設定為限制單個結果,僅包含 objectclass 屬性和 500ms 超時。如果返回的 NamingEnumeration 有結果,則 DirContext 透過驗證。如果沒有返回結果或丟擲異常,則 DirContext 驗證失敗。預設設定應適用於大多數 LDAP 伺服器,無需更改配置,並提供驗證 DirContext 的最快方式。如果需要自定義,可以使用驗證配置屬性進行,如池配置中所述。
如果連線丟擲被認為是非瞬時異常的異常,則會自動使連線失效。例如,如果 DirContext 例項丟擲 javax.naming.CommunicationException,則將其解釋為非瞬時錯誤,並且例項會自動失效,而無需額外的 testOnReturn 操作開銷。解釋為非瞬時異常的異常透過 PoolingContextSource 的 nonTransientExceptions 屬性進行配置。 |
池配置
<ldap:pooling /> 元素上提供以下屬性,用於配置 DirContext 池
| 屬性 | 預設值 | 描述 |
|---|---|---|
|
|
此池中可同時分配的每種型別(只讀或讀寫)的最大活動連線數。非正數表示無限制。 |
|
|
此池中可同時分配的所有型別(總計)的最大活動連線數。非正數表示無限制。 |
|
|
每種型別(只讀或讀寫)在池中可保持空閒的最大活動連線數,超出此數量的連線將被釋放。非正數表示無限制。 |
|
|
每種型別(只讀或讀寫)在池中可保持空閒的最小活動連線數,超出此數量的連線將被建立。可以使用零(預設值)表示不建立。 |
|
|
池在丟擲異常之前(當沒有可用連線時)等待連線返回的最大毫秒數。非正數表示無限期等待。 |
|
|
指定池耗盡時的行為。
|
|
|
物件是否在從池中借用之前進行驗證。如果物件驗證失敗,則將其從池中刪除,並嘗試借用另一個物件。 |
|
|
物件是否在返回到池之前進行驗證。 |
|
|
物件是否由空閒物件驅逐器(如果有)進行驗證。如果物件驗證失敗,則將其從池中刪除。 |
|
|
空閒物件驅逐執行緒執行之間的休眠毫秒數。非正數表示不執行空閒物件驅逐執行緒。 |
|
|
在空閒物件驅逐執行緒的每次執行期間(如果有)檢查的物件數。 |
|
|
物件在池中空閒的最短時間,此後它有資格被空閒物件驅逐器(如果有)驅逐。 |
|
|
驗證連線時使用的搜尋基準。僅當指定 |
|
|
驗證連線時使用的搜尋過濾器。僅當指定 |
|
|
驗證連線時要使用的 |
|
|
以逗號分隔的 |
Pool2 配置
<ldap:pooling2 /> 元素上提供以下屬性,用於配置 DirContext 池
| 屬性 | 預設值 | 描述 |
|---|---|---|
|
|
此池中可同時分配的所有型別(總計)的最大活動連線數。非正數表示無限制。 |
|
|
按鍵分配的池中物件例項(已取出或空閒)的數量限制。達到限制時,子池耗盡。負值表示無限制。 |
|
|
每種型別(只讀或讀寫)在池中可保持空閒的最大活動連線數,超出此數量的連線將被釋放。負值表示無限制。 |
|
|
每種型別(只讀或讀寫)在池中可保持空閒的最小活動連線數,超出此數量的連線將被建立。可以使用零(預設值)表示不建立。 |
|
|
池在丟擲異常之前(當沒有可用連線時)等待連線返回的最大毫秒數。非正數表示無限期等待。 |
|
|
是否等待直到新物件可用。如果 max-wait 為正,並且在 |
|
|
物件是否在借用之前進行驗證。如果物件驗證失敗,則借用失敗。 |
|
|
指示物件是否在從池中借用之前進行驗證。如果物件驗證失敗,則將其從池中刪除,並嘗試借用另一個物件。 |
|
|
指示物件是否在返回到池之前進行驗證。 |
|
|
指示物件是否由空閒物件驅逐器(如果有)進行驗證。如果物件驗證失敗,則將其從池中刪除。 |
|
|
空閒物件驅逐執行緒執行之間的休眠毫秒數。非正數表示不執行空閒物件驅逐執行緒。 |
|
|
在空閒物件驅逐執行緒的每次執行期間(如果有)檢查的物件數。 |
|
|
物件在池中空閒的最短時間,此後它有資格被空閒物件驅逐器(如果有)驅逐。 |
|
|
物件在池中空閒的最短時間,此後它有資格被空閒物件驅逐器驅逐,並附加條件是池中每個鍵至少保留最小數量的物件例項。如果 |
|
|
此池使用的驅逐策略實現。池嘗試使用執行緒上下文類載入器載入類。如果失敗,池嘗試使用載入此類的類載入器載入類。 |
|
|
池公平地服務等待借用連線的執行緒。 |
|
|
JMX 已為池的平臺 MBean 伺服器啟用。 |
|
|
JMX 名稱基準,用作分配給啟用 JMX 的池的名稱的一部分。 |
|
|
JMX 名稱字首,用作分配給啟用 JMX 的池的名稱的一部分。 |
|
|
指示池對於空閒物件是具有 LIFO(後進先出)行為還是 FIFO(先進先出)佇列行為。LIFO 總是從池中返回最近使用的物件,而 FIFO 總是返回空閒物件池中最舊的物件。 |
|
|
用於驗證搜尋的基準 DN。 |
|
|
用於驗證查詢的過濾器。 |
|
|
驗證連線時要使用的 |
|
|
以逗號分隔的 |
配置
配置連線池需要將 <ldap:pooling> 元素巢狀在 <ldap:context-source> 元素中,如下所示
<beans>
...
<ldap:context-source
password="secret" url="ldap://:389" username="cn=Manager">
<ldap:pooling />
</ldap:context-source>
...
</beans>
在實際情況下,您可能會配置池選項並啟用連線驗證。前面的示例演示了一般思路。
已知問題
本節描述了人們使用 Spring LDAP 時有時會出現的問題。目前,它涵蓋了以下問題
自定義身份驗證
PoolingContextSource 假定所有從 ContextSource.getReadOnlyContext() 檢索到的 DirContext 物件具有相同的環境,同樣,所有從 ContextSource.getReadWriteContext() 檢索到的 DirContext 物件也具有相同的環境。這意味著將配置了 AuthenticationSource 的 LdapContextSource 包裝在 PoolingContextSource 中將無法按預期工作。連線池將使用第一個使用者的憑據填充,並且除非需要新連線,否則後續的上下文請求將不會為請求執行緒的 AuthenticationSource 指定的使用者填充。