3

我有一个缓存 bean,用于在应用程序中查找/存储有关对象的信息。我想尽可能少地获取视图,因为我想象每个 Database.getView 都需要付出一些代价。

触发“视图已被回收”的最便宜的方法是什么?

4

2 回答 2

3

设计一个测试器类来测试各种 Domino 对象怎么样?

如果对象被回收,您可以执行一个将引发异常的操作,而不仅仅是测试 null。像下面的代码这样的东西会起作用,还是我过于简单化了?

package com.azlighthouse.sandbox;

import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.NotesException;

public class NPHchecker {

    public static boolean isRecycled(Document source, boolean printStackTrace) {
        try {
            return (source.getUniversalID().length() > 0);
        } catch (NotesException e) {
            if (printStackTrace)
                e.printStackTrace();
            return true;
        }
    } // isRecycled(Document, boolean)

    public static boolean isRecycled(Database source, boolean printStackTrace) {
        try {
            return (source.getReplicaID().length() > 0);
        } catch (NotesException e) {
            if (printStackTrace)
                e.printStackTrace();
            return true;
        }
    } // isRecycled(Database, boolean)


}  // NPHchecker
于 2012-10-05T10:17:26.860 回答
2

在 Sven Hasselbach 的启发下,我创建了这个方法:

/*
Classes that need to be imported:
import java.lang.reflect.Method;
import lotus.domino.Base;
import lotus.domino.local.NotesBase;
*/

public static boolean isRecycled( Base object ) {
    boolean isRecycled = true;
    if( ! ( object instanceof NotesBase ) ) { 
        // No reason to test non-NotesBase objects -> isRecycled = true
        return isRecycled;
    }

    try {
        NotesBase notesObject = (NotesBase) object;
        Method isDead = notesObject.getClass().getSuperclass().getDeclaredMethod( "isDead" );
        isDead.setAccessible( true );       

        isRecycled = (Boolean) isDead.invoke( notesObject );
    } catch ( Throwable exception ) {
        // Exception handling
    }

    return isRecycled;
}

更新:似乎使用此方法需要更改 java.policy。特别是这一行:notesObject.getClass().getSuperclass().getDeclaredMethod( "isDead" )

于 2012-10-11T10:23:17.190 回答