使用Ehcache時發現個不起眼的小問題
在一個Model中有以下代碼:
public class MyModel implements Serializable {
private static final long serialVersionUID = -990334519496260591L;
private IUserService us = ServiceManager.me.getUserService();
//getter and setter
}
在将這個Model的一個執行個體緩存到Ehcache時,如果恰好Ehcache配置了允許儲存到磁盤,那麼就會提示錯誤:
ERROR DiskStorageFactory Disk Write of xxxxxxx failed:
java.io.NotSerializableException: com.my.service.impl.UserServiceImpl$$EnhancerByGuice$$80ede2b6
看錯誤提示,很明顯是 UserServiceImpl 對象無法序列化,原來是Ehcache把這個服務邏輯也看成了Model的普通屬性
正常情況下,将 UserServiceImpl 實作 Serializable 接口就可以解決問題
但實際上,這個服務是無狀态的單列模式,将它序列化到磁盤是沒有任何意義的,還會增加磁盤的IO開銷
那怎麼樣才能将Model成功緩存,又能刨除這些服務邏輯的屬性呢?
這時候,一個不起眼的關鍵字發揮了作用:transient
将上面的代碼改成如下,其實隻是增加了這個關鍵字而已:
public class MyModel implements Serializable {
private static final long serialVersionUID = -990334519496260591L;
private transient IUserService us = ServiceManager.me.getUserService();
//getter and setter
}
再次緩存時,将不會提示錯誤。
這裡有一篇文章對 transient 關鍵字進行了更詳細的闡述:
https://www.cnblogs.com/lanxuezaipiao/p/3369962.html寵辱不驚,看庭前花開花落;去留無意,望天上雲卷雲舒