2011-08-08 45 views
3

我想找到什麼是「靜態/全局」通常的設計/方法!數據訪問/存儲在一個Web應用程序,我使用struts 2.背景,我有很多表我想在我的Web應用程序中顯示。Struts2靜態數據存儲/訪問

問題1: 這些表格只會在服務器上每天更新並更新一次,我不想爲每個查看錶的請求訪問數據庫/或加載文件。 我寧願將表加載到某個全局內存/緩存一次(一天),並且每個請求都從那裏獲取表,而不是訪問數據庫。 我想這是一個常見的情況,並有一個確定的方法?但我目前無法找到它。 對於struts 2,ActionContext是這個數據的正確位置。 如果是這樣,任何指向教程的鏈接將非常感激。

問題2 表存儲在一個XML文件中,我使用JAXB解組以獲取表對象,以及表的列表。 對於一個小應用程序來說,這沒問題,但我認爲對於web應用程序來說,它將haml存儲爲資源並將文件作爲servlet上下文和解析讀取,或者它是? 我意識到我可能會被告知將表存儲到一個數據庫訪問一個道,並使用休眠來獲取對象。 我只是好奇,數據已經存儲在XML文件中的通常做法是什麼?鑑於我每天都會有新的XML文件。

道歉,如果問題是基本的,我有大量的書籍/參考材料,但它只是花時間去獲得更高水平的設計答案。

回答

1

這根本不是Struts2所特有的。你絕對不想嘗試將這些信息存儲在ActionContext - 這是一個每個請求對象。

你應該看看像EHCache或類似的緩存框架。如果您使用Hibernate來實現持久性,Hibernate有用於緩存數據的選項,以便它不需要在每個請求中都訪問數據庫。 (Hibernate也可以使用EHCache作爲其二級緩存)。

+1

Hello Steven和Quaternion @Quaternion, 謝謝你的答案。我同意你的意見,因爲我最好花時間實施hibernate + Ehcache設計。 關於休眠和緩存的任何感興趣的文章,3部分, [瞭解Hibernate中的緩存](http://blog.dynatrace.com/2009/02/16/understanding-caching-in-hibernate-part-one -the會話緩存/) – kealan

2

沒有真正看過高速緩存選項我會從數據庫中獲取數據我的自我,但只有經過了一段時間。

通常你在Action範圍內工作,下一級是Session,最全局的是Application。測試這個簡單的方法是創建一個實現ApplicationAware的Action類。然後,您可以從任何jsp/action獲取這些值...在任何可以到達ActionContext(任何地方)的地方,請參閱:http://struts.apache.org/2.0.14/docs/what-is-the-actioncontext.html

無論如何,我會實現一個基本的攔截器來檢查是否有新數據應該是可用的,我還沒有查找它,然後加載新的數據(用戶觸發這個攔截器可能不需要這個新的數據,所以在一個新線程中這樣做是個好主意)。

由於您負責管理某些數據結構並使其與ORM合作,因此此方法增加了複雜性。

我這樣做是爲了從表中加載數據,永遠不需要再次加載數據,並且數據站在它自己的表面上(我不需要查找它與其他表之間的關係)。這是快速和骯髒的,史蒂文斯的解決方案是更強大的,並可能會在以後的日子,當進一步的性能是一個要求賠償。

0

如前所述,最好的方法是使用EHCache或其他可信緩存管理器。

另一種方法是使用工廠來訪問信息。舉例來說,某事的效果:

public class MyCache { 
    private static MyCache cache = new MyCache(); 

    public static MyCache getCache() { 
    return cache; 
    } 

    (data members) 

    private MyCache() { 
    (update data members) 
    } 

    public synchronized getXXX() { 
    ... 
    } 

    public synchronized setXXX(SomeType data) { 
    ... 
    } 
} 

你需要確保你同步您所有的讀取和寫入,以確保你沒有競爭條件,同時更新緩存。

synchronized (MyCache.getCahce()) { 
    MyCahce.getCache().getXXX(); 
    MyCache.getCache().getTwo(); 
    ... 
} 

此外,最好使用的EHCache或別的東西,交鑰匙,因爲這很可能是沒有的機制很好的理解善變。這種緩存也有性能問題,因爲它只允許一個線程一次讀/寫緩存。 (可能的加速方法是使用線程本地和讀/寫鎖 - 但已經內置到很多已建立的緩存管理器中)