2014-02-13 164 views
1

在我的web應用程序中,我必須將相同的數據從DB帶入webapplicatio,這需要很多時間。 我所做的是,我把這些數據放到了HashMap中。這樣我就不必每次都把它帶入網絡應用程序。但是,最大的問題是,所有用戶都會使用相同的數據進行操作,而這些數據會隨之改變。 我的第一個問題是:將數據庫中的數據保存在HashMap中是否正確,因此我不必每次都從數據庫查詢它? 我的第二個問題是,如果我可以使用HashMap保存數據,我必須對數據進行深度複製或克隆,並將其放入HashMap中,以便每個用戶都擁有原始數據的副本。對?java克隆深拷貝HashMap

我要克隆的對象是一個傳輸對象,它具有對其他Object和HashMaps的引用。 這個過程是這樣的:首先從數據庫中獲取數據,創建類並將所有類放入一個傳輸對象中,並將該傳輸對象放入一個哈希映射中。下一次,從hashmap中獲取數據。

感謝您的幫助。 編輯:來自數據庫的數據創建一個在線表單,並具有默認值,如姓名,地址和性別......所有用戶必須編輯表單以滿足自己的需要。這樣,每個用戶都必須擁有自己的副本才能對其進行操作。

+0

是的,你可以做到這一點,沒有你不需要做一個深拷貝。我不知道任何默認使用深度副本的數據庫緩存解決方案。 –

+0

嗨,彼得,謝謝你的迴應。我不想要數據庫緩存解決方案。我以某種方式克隆傳輸對象,因此每個用戶都可以使用他自己的副本。 – duracell

+0

或者您可以強制或強制該用戶無法更改該對象。 –

回答

4

深度克隆的一種非常簡單的方法是序列化/反序列化對象。如果你的hashmap中的所有鍵/值都實現了java.io.Serializable,這將只能工作。

如:

public <T extends Serializable> T deepClone(T o) { 
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(byteOut); 
    out.writeObject(o); 
    out.flush(); 
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray()); 
    return o.getClass().cast(in.readObject()); 
} 
+0

嗨蘭斯,謝謝!我有一些框架(commons-lang SerializationUtils,Java Deep Cloning LibraryDozer和Kryo​​)。一些使用序列化,一些使用反射做深層克隆。我不知怎麼複製轉移對象,但我很高興看到最後我要克隆。謝謝 – duracell