2012-02-09 63 views
1

我主要使用Hibernate来减少我的应用程序的内存消耗,因为我可以将数据存储在数据库而不是内存中。基本上,有一个主要实体Song代表从目录加载的音乐文件,但是我在向数据库添加歌曲(使用hibernate)之后执行的第一件事是将其添加到执行者管道中以供进一步处理,以便代表每首歌曲的对象仍然在记忆中,并保持如此状态,直到歌曲处理完毕,所以我没有节省太多内存。使用Hibernate的二级缓存是否可以减少内存使用量或只是数据库访问?

我的第一个想法是,当我将它们添加到pipleline时仅存储歌曲的id,并且只在需要处理时才得到实际的实体,但这似乎是对付而不是Hibernate。

相反,我想知道如果我将Ehcache与配置为使用磁盘缓存的Hibernate配合使用,这意味着我使用的实例不会使用太多的内存,或者它们会像以前一样使用尽可能多的内存,一旦我实际上有一个参考给我的应用程序中的他们。

回答

0

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

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

+0

好吧,和延迟加载类似地设计用于重新调用数据库调用,而不是内存不是它,即使我选择做懒惰加载,一旦它已经检索更多然后最小它不会放手 – 2012-02-09 17:15:40

+1

编号延迟加载用于避免加载不需要加载的东西,同时仍然允许引用它。我不认为在你的情况下使用代理将是一个解决方案。在管道中存储ID对我来说看起来非常合适。我不明白你的第二句话。 – 2012-02-09 17:30:44

+0

我会尝试改写,如果你懒惰加载歌曲1它只会包含该歌曲的ID(或者它是歌曲表中包含的ID和所有简单的字段)。然后,如果您必须使用需要对第二个表(如coverart)进行sql调用的字段,那么会将coverart图像添加到实体,然后该实体会继续将该数据保存在内存中,直到您不再参考它为止它永远不会回复到不包含coverart图像的实体版本。 – 2012-02-09 17:39:15

相关问题