【发布时间】:2015-10-11 17:55:44
【问题描述】:
我正在开发一个依赖于缓存的应用程序,主要使用读取和一些更新。
我使用的技术栈是 Spring + Hibernate + Ehcache。
我需要使用缓存来服务请求,而根本不访问数据库。
我遵循的方法是在应用程序启动时使用 getSession().createCriteria(<Entity>.class).list() 之类的查询缓存所有数据,然后使用 session.get() 调用向 Hibernate 询问实体,以便它使用二级缓存来解析。
我看到的一个挑战是我的实体类有很多集合和关联属性(带有额外列的多对多、一对多、一对一)。
对于这样的缓存,我有两种方法:
将所有关系保持为 EAGER fetch。缓存将在启动时使用包含左外连接的大查询填充数据。 我担心急切地加载数据可能会导致不必要的长时间运行的查询返回多行。
将关系保持为 LAZY 并遍历所有行并调用
.getSetOf<Entity>以加载相关实体。 我担心我会在启动时对所有数据进行虚拟迭代,我不确定这是否是一种好的做法。
由于 Hibernate 中的关联是使用组合键和外键关联的,而不是存储为单独的 ID,因此加载此类关联/集合似乎是开销。
我希望将表数据放在不同的缓存区域中,它们的外键关系只是 ID(而不是组合/集合)。我会将所有此类实体缓存在不同的区域中,并在运行时通过迭代这些区域来组合结果。
谁能建议我应该采用什么方法?如果有任何替代方法,请提出建议。
【问题讨论】:
标签: java spring hibernate caching