【问题标题】:Does 2nd Level Cache with Hibernate reduce memory usage or just database accesses?使用 Hibernate 的 2 级缓存会减少内存使用量还是仅减少数据库访问?
【发布时间】:2012-02-09 16:33:41
【问题描述】:

我主要使用 Hibernate 来减少我的应用程序的内存消耗,因为我可以将数据存储在数据库中而不是内存中。本质上,有一个主要实体 Song 表示从目录加载的音乐文件,但在将歌曲添加到数据库(使用休眠)后,我要做的第一件事是将其添加到执行器的管道中以进行进一步处理,以便实例代表每首歌曲的对象仍在内存中,并且在歌曲被处理之前一直如此,所以我不会节省太多内存。

我的第一个想法是,当我将歌曲添加到管道时,我只存储歌曲的 id,并且只在需要处理时才获取实际实体,但这似乎与 Hibernate 不相符。

相反,我想知道我是否将 Ehcache 与配置为使用磁盘缓存的 Hibernate 一起使用,这是否意味着我使用的实例不会使用太多内存,或者一旦我实际参考了它们,它们是否会使用与以前一样多的内存它们在我的应用程序中。

【问题讨论】:

    标签: hibernate ehcache


    【解决方案1】:

    如果您有对实体的引用,那么显然该对象在内存中(除非该引用是对延迟加载代理的引用)。

    EHCache 用于避免过于频繁地访问数据库,并从内存或磁盘缓存中获取实体。使用它会增加内存,而不是减少它。

    【讨论】:

    • 好的,延迟加载同样是为减少数据库调用而不是内存而设计的,不是吗,即即使我选择进行延迟加载,一旦它检索到的最小值超过了它不会放手的最小值
    • 没有。延迟加载用于避免加载不需要加载的内容,同时仍然允许对其进行引用。我不认为在您的情况下使用代理将是一个解决方案。在管道中存储 ID 对我来说看起来完全没问题。我不明白你的第二句话。
    • 如果你延迟加载歌曲 1,我会尝试改写它只包含该歌曲的 id(或者它是歌曲表中包含的 id 和所有简单字段)。然后,如果您必须使用需要对第二个表(例如coverart)进行sql调用的字段,它将将该coverart图像添加到实体中,然后该实体将继续将该数据保存在内存中,直到您不再引用它,它永远不会恢复到不包含封面图像的实体版本。
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多