我想看看EclipseLink中隔离缓存(L1缓存)中存储了哪些对象。有没有让我这样做的API?我试过google但是找不到任何东西。
如果您对它的原因感兴趣,因为我发现在持久化上下文中加载一些对象之后,查询变慢,例如在事务开始时花了100毫秒的查询现在它&#39如果在其他一些操作已经发生之后在事务中间执行,则需要200 ms。如果我在查询执行之前执行entityManager.clear()
,则查询再次需要100毫秒。我相信这是因为持久化上下文中加载了许多影响EclipseLink性能的对象。这就是为什么我想验证持久化上下文中的对象的原因。
答案 0 :(得分:0)
在探索EclipseLink源代码后,我发现存储在持久化上下文(隔离缓存)中的对象位于名为identityMaps的映射中,每个实体类都有一个存储该类型所有对象的映射。
您可以使用以下方法打印地图内容:
public interface IdentityMapAccessor {
/**
* PUBLIC:
* Used to print all the Objects in the identity map of the given Class type.
* The output of this method will be logged to this session's SessionLog at SEVERE level.
*/
public void printIdentityMap(Class theClass);
/**
* PUBLIC:
* Used to print all the Objects in every identity map in this session.
* The output of this method will be logged to this session's SessionLog at SEVERE level.
*/
public void printIdentityMaps();
}
示例:
((JpaEntityManager) entityManager.getDelegate())
.getActiveSession()
.getIdentityMapAccessor()
.printIdentityMaps();
((JpaEntityManager) entityManager.getDelegate())
.getActiveSession()
.getIdentityMapAccessor()
.printIdentityMap(MyClass.class);