【发布时间】:2019-07-10 16:21:43
【问题描述】:
我使用 Hibernate/JPA 作为持久性后端,本质上归结为一个用 Java 编写的游戏的模组。
在这种情况下,在主线程上尽可能少地查询数据库对我来说非常重要。尽管可能,但异步执行此操作是不切实际的,因为我必须从其他线程调用游戏对象的方法,而这通常不起作用。这意味着我必须使用缓存对象在内存中做尽可能多的事情,以最大限度地提高性能(因为使用内存比等待查询从数据库返回结果要快)。
假设我有如下定义的实体:
@Entity
class Town {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@OneToMany(mappedBy = "town", fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this
private Set<Resident> residents;
// ... other fields and associated getters/setters
}
@Entity
class Resident {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@ManyToOne(fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this
@JoinColumn(name = "town_id")
private Town town;
// ... otehr fields and associated getters/setters
}
我的问题如下:
如果我要使用 Hibernate 检索所有 Resident 实体,并将它们存储在内存中(例如,使用 HashMap ),然后如果我要继续使用 Hibernate 检索所有 Town 实体并以相同的方式缓存它们,调用Town#getResidents() 是否会返回对内存中某些与驻留缓存中存在的对象相同的对象的引用?
本质上,Hibernate 是否会重用之前在查询中返回的仍然有效的对象来填充新创建的集合?
我也不反对任何对我的一般方法的批评或关于如何改进它的建议。先感谢您! :)
【问题讨论】:
-
您可以查看 EclipseLink,它是 JPA 参考实现。从很久以前开始,它相对于 Hibernate 的优势之一就是它缓存对象而不是数据。这就是为什么它将其缓存称为“身份映射”。如果您使用的是纯 JPA,则可以将其放入您的应用程序中而不会带来太多痛苦。
标签: java performance hibernate jpa caching