【问题标题】:What is the least expensive way to test if a View has been recycled?测试视图是否已被回收的最便宜的方法是什么?
【发布时间】:2012-10-05 06:40:54
【问题描述】:

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

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

【问题讨论】:

  • 我也有这个问题,但是自从阅读了 Paul Withers 的 intec.co.uk/… 之后,我就不再缓存 Domino 对象了。我现在只缓存文档字段中的 UNID 或值。正如 Nathan 在 cmets 中所说,我们可以在 Domino 对象中使用“isRecycled()”方法。
  • 我从不缓存文档。我想缓存视图的原因是文档查找是临时的/每个项目。当 bean 数据不再是最新的时,文档值被读入 bean。有时可能有 100 多个查找 (=100+ getView)。当视图没有被缓存时,我仍然可以获得很好的性能,但是如果我能获得更好的性能,那就太好了:)
  • 您可以预期每个 Notes 对象在请求阶段后都会被回收。
  • 您可以在调用者中初始化视图并将其作为参数传递给每个方法调用。例如,在 XPage 中定义视图并在每次进行查找时将其作为参数传递给 Java 方法或 bean。我想你会在一个请求中被保存
  • 关于这个问题的一切都发生在 bean 中,但您的建议仍然有效。这将负责为每次查找执行 getView。看起来几乎没有实验来检查视图是否已被回收,所以我可能会避免这个问题并在需要的地方编写几行额外的代码。公共 isRecycled 方法会很好:)

标签: xpages lotus-domino


【解决方案1】:

如何设计一个测试器类来测试各种 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

【讨论】:

  • 那是我的意图。唯一的麻烦是我不知道缓存了哪些方法调用。例如。即使视图已被回收,NotesView.getUniversalID() 或 NotesView.getName() 也可能返回缓存值。
  • 我更喜欢这种方式,因为很难将更改推送到大公司的 java.policy 文件。我还没有遇到缓存问题。
【解决方案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")

【讨论】:

  • 这会在我的 853 服务器上引发 SecurityException(“不允许访问类 lotus.domino.local.NotesDatabase 中的成员”)以检索 isDead 声明的方法。我有一个默认的 java.policy。你改变了那个文件吗?
  • @MarkLeusink: 请尝试授予 permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
  • 感谢您的提示。这可能会奏效,但我不想更改 Java 策略只是为了能够检查对象是否被回收。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 2012-02-19
  • 2011-01-21
  • 2023-03-12
  • 2015-07-18
  • 2010-10-30
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多