2011-08-26 90 views
1

目前的情況是我使用的是JSF請求範圍豆做我的CRUD操作。正如我相信你最有可能知道Tomcat沒有提供容器管理的持久性,所以在我的CRUD請求bean中,我使用EnityManagerFactory來獲得Enity manager的摺疊。現在,我的選擇使用請求的有效性範圍的bean完成這個任務,它可能是開放的討論(再次),但我一直在試圖把它放在我的文章已經閱讀上下文,你給我鏈接特別是第一個和第二個。從我收集的內容中,EclipseLink默認使用存儲緩存實體的二級緩存。在ExlipseLink例子 - JPA緩存網站上面說:JPA2實體緩存

持久化單元(EntityManagerFactory的,或服務器)

的時間共享緩存中現在並不使我的緩存的實體住了在正在對CRUD請求bean進行調用期間的一小部分時間,因爲bean被銷燬的時刻以及EntityManagerFactory所以是緩存。此外,上面一句的最後一部分「的EntityManagerFactory,或服務器」讓我困惑..什麼正是由或服務器在這方面的意思,一個人如何控制它。如果我使用@Cache註釋和到期屬性的設置適當的量,將是做的工作,保持存儲在服務器的二級緩存比實體,不管我的EntityManagerFactory是否已被破壞?

我知道有很多的考慮要做,每個應用程序都有具體的要求。從我的角度來看,配置L2緩存可能是最好的選擇(如果不僅僅是Tomcat),可以優化事情。從你的第一個鏈接引用:

L2高速緩存的優點是:

  • 避免數據庫訪問的已加載實體
  • 更快的讀取頻繁訪問未修改實體

缺點L2高速緩存的有:

  • 內存消耗大量的對象
  • 陳舊的數據更新的對象
  • 併發寫入(樂觀鎖定異常,或悲觀鎖)
  • 糟糕的可伸縮性頻繁或同時更新實體

你應該配置L2緩存是實體:讀

  • 經常
  • MODI如果陳舊

田間很少

  • 並不重要,幾乎所有上述各點適用於我的應用程序。除此之外,它的核心是持續不斷地閱讀實體並將其展示在網站上(該應用將作爲列表屬性的入口)。在應用程序中還有一個小型購物車,但銷售的產品不是以庫存而是以服務形式出現的有形物品。在這種情況下,陳舊的實體是沒有問題的,所以我認爲,並不是因爲產品(這裏的服務)永遠不會寫入併發。所以這些實體會經常被讀取,而且它們很少會被修改(而且那些修改不會成爲購物車的一部分,甚至那些修改也很少),因此如果失效的話不是關鍵。最後,前兩點似乎正是我所需要的,即避免數據庫訪問已經加載的實體並快速讀取經常訪問的未修改的入口。但是,有一點仍然關係到我的缺點:大量對象的內存消耗。這與我原來的問題不一樣嗎?

    我現在的理解是,有兩個選項,其中只有一個適用於我的情況:

    1. 爲了能夠更長期緩存的工作委託給持久層比我更需要有訪問PersistenceContext並創建會話作用域bean並設置PersistenceContextType.EXTENDED。 (這個選項不適用於我,不能訪問PersistenceContext)。

    2. 在實體上配置L2 @Cache註釋,或者像上面的選項1一樣,創建一個會處理長期緩存的會話作用域bean。但是,這些不是回到我原來的問題嗎?

    我很想聽聽你的意見,看看你認爲可能是解決這個合理的方式,或者是你如何已在以前的項目接近它。哦,還有一件事,只是爲了確認..當使用@Cache註釋一個實體時,所有鏈接的實體都將被緩存,所以我不必對它們進行註釋?

    再次所有的評論和指針非常讚賞。


    感謝您的閱讀答題..當你說

    「在Tomcat中,你將是最好有保存到EntityManagerFactory的服務器期間一些靜態的經理。」

    這是否意味着我可以例如聲明和初始化應用程序範圍內的靜態EntityManagerFactory字段以供所有的bean隨後在整個應用程序的整個生命週期中使用?

  • 回答

    0

    EclipseLink默認使用共享緩存。這是從EntityManagerFactory訪問的所有EntityManagers共享的。您無需執行任何操作即可啓用緩存。

    通常,您不希望爲每個請求創建新的EntityManagerFactory,只需要新建一個EntityManager。創建一個新的EntityManagerFactory非常昂貴,所以不是一個好主意,即使忽略緩存(它有自己的連接池,必須初始化元數據等)。

    在Tomcat中,您最好擁有一些靜態管理器,該靜態管理器在服務器期間保存到EntityManagerFactory中。請不要關閉它,或者在Servlet被銷燬時關閉它。