我正在使用主要读取和某些更新来依赖缓存的应用程序。使用Spring,Hibernate和Ehcache缓存整个数据库
我使用的技术堆栈是Spring + Hibernate + Ehcache。 我需要使用缓存为请求提供服务,而不是根本访问数据库。 我遵循的方法是使用查询(如getSession().createCriteria(<Entity>.class).list()
)在应用程序启动时缓存所有数据,然后使用session.get()
调用请求Hibernate查找实体,以便它使用二级缓存来解析。
我看到的一个挑战是我的实体类有很多收集和关联属性(多对多,多列,一对多,一对一)。
我有这样一个缓存两种方法:
保留所有关系,因为预先抓取。在启动时,缓存将充满包含左外连接的大查询的数据。 我担心加载数据会导致不必要的长时间运行查询返回多行。
将关系保持为懒惰并迭代所有行并呼叫
.getSetOf<Entity>
加载相关实体。 我担心我将在启动时虚拟迭代所有数据,我不确定这是否是一种好的做法。
由于休眠的关联是使用组合物和外键相关联,并且没有被存储为单独的ID,这种关联的装载/集合似乎是开销。
我希望有不同缓存区域中的表数据,其外键关系只是ID(不是组合/集合)。我会在不同区域缓存所有这些实体,并且会在运行时通过迭代这些区域来合并结果。
任何人都可以提出我应该遵循什么方法?如果有其他方法,建议。
感谢您的回复。关于何时需要向userRole Collection添加角色(比如userInfo.getuserRoles()。add(new UserRole()))添加它时,hibernate会使集合失效。下一次使用userInfo.getUserRoles()时,它会再次查询Db。任何可以处理的方式。即如何避免缓存失效? – ankurlu
在失效的情况下,我们正在刷新缓存。是的,你是对的,我们将再次击中数据库以获取更新的UserInfo。 –
您是否认为使用Core Ehcache API是一种去那里的方法。我将使用EHcache API在启动时缓存数据,并且具有添加/删除/修改缓存的灵活性,而不依赖于Hibernate来实现这一点。 – ankurlu