2017-03-15 61 views
2

最近能夠看到,而訪問頁面正在加載非常緩慢,並在error.log文件緩存,內存泄漏相關的錯誤,這使我在一個問題一個AEM實例可以處理多少個JCR會話。AEM實例能夠處理多少個JCR會話?

+0

這取決於很多因素,沒有答案可能。例如:泄漏的原因是什麼? –

+0

@FlorianSalihovic我們有一個DEV框,其中所有的用戶都被連接並試圖執行/測試開發的代碼庫。 (大多數代碼片段都有JCR會話來建立和檢索數據類用例),而測試頁面幾乎無法加載。那麼是否有辦法找出JCR Sessions有多少已經建立,並且AEM服務器可以處理的最大限制。 – VAr

+0

您是否在日誌中看到類似「CacheManager:resizeAll」的內容?如果是,請嘗試以下命令:jmap -histo | grep SessionImpl應該給你一個會話列表。我認爲這取決於兩個主要因素,即開放率和會議結束率。不會關閉會話的錯誤代碼。如果長時間運行的操作太多,那麼即使寫得很好的代碼也會導致JCR會話數量的增加(例如對於慢Mongo部署)並且系統減速停止。 –

回答

1
  1. 使用ResourceResolver接口並避免使用Session
  2. 如果爲您的服務,Servlet或模型(Sling Model,WCMUse)提供了ResourceResolver,或者您通過自適應創建了一個實例:請勿關閉它。
  3. 如果您必須通過ResourceResolverFactory手動創建ResourceResolver,那麼在完成後它應該是短暫的並關閉。
  4. 同樣適用於Session

例子:

package io.salihovic.florian.examples; 

import javax.annotation.CheckForNull; 

interface ResourceResolverTemplate { 

    @CheckForNull ResourceResolver getResourceResolver(); 

    default void usage() { 
    final ResourceResolver resolver = this.getResourceResolver(); 
    if (resolver != null) { 
     // do something 
     resolver.close(); 
    } 
    } 
}