如何在EclipseLink中打印存储在隔离缓存中的对象?

时间:2012-12-28 17:13:07

标签: java jpa eclipselink

我想看看EclipseLink中隔离缓存(L1缓存)中存储了哪些对象。有没有让我这样做的API?我试过google但是找不到任何东西。

如果您对它的原因感兴趣,因为我发现在持久化上下文中加载一些对象之后,查询变慢,例如在事务开始时花了100毫秒的查询现在它&#39如果在其他一些操作已经发生之后在事务中间执行,则需要200 ms。如果我在查询执行之前执行entityManager.clear(),则查询再次需要100毫秒。我相信这是因为持久化上下文中加载了许多影响EclipseLink性能的对象。这就是为什么我想验证持久化上下文中的对象的原因。

1 个答案:

答案 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);