在 Java Bean 中回收 Domino 对象的最佳方法是什么

2023-11-22

我使用一个函数来访问配置文档:

private Document lookupDoc(String key1) {
    try {
        Session sess = ExtLibUtil.getCurrentSession();
        Database wDb = sess.getDatabase(sess.getServerName(), this.dbname1);
        View wView = wDb.getView(this.viewname1);
        Document wDoc = wView.getDocumentByKey(key1, true);
        this.debug("Got a doc for key: [" + key1 + "]");
        return wDoc;
    } catch (NotesException ne) {
        if (this.DispLookupErrors)
            ne.printStackTrace();
        this.lastErrorMsg = ne.text;
        this.debug(this.lastErrorMsg, "error");
    }
    return null;
}

在另一种方法中,我使用此函数来获取文档:

Document wDoc = this.lookupDoc(key1);

if (wdoc != null) {
    // do things with the document
    wdoc.recycle();
}

当我回收 Document 对象时,是否应该回收 Database 和 View 对象?或者应该在函数返回 Document 之前回收它们?


最佳实践是在创建 Domino 对象的范围内回收所有对象。然而,回收任何对象会自动回收它“下面”的所有对象。因此,在您的示例方法中,您can't回收 wDb,因为这会导致 wDoc 也被回收,所以您将返回回收的文档句柄。

因此,如果您想确保不泄漏内存,最好以相反的顺序回收对象(例如,首先是文档,然后是视图,然后是数据库)。这往往需要构建您的方法,以便您可以使用 Domino 对象执行您需要的任何操作inside无论什么方法获取它的句柄。

例如,我假设您定义一个获取配置文档的方法的原因是为了您可以从中提取配置设置的值。因此,与其定义一个返回文档的方法,也许定义一个返回文档的方法会更好。物品价值:

private Object lookupItemValue(String configKey, itemName) {
    Object result = null;
    Database wDb = null;
    View wView = null;
    Document wDoc = null;
    try {
        Session sess = ExtLibUtil.getCurrentSession();
        wDb = sess.getDatabase(sess.getServerName(), this.dbname1);
        wView = wDb.getView(this.viewname1);
        wDoc = wView.getDocumentByKey(configKey, true);
        this.debug("Got a doc for key: [" + configKey + "]");
        result = wDoc.getItemValue(itemName);
    } catch (NotesException ne) {
        if (this.DispLookupErrors)
            ne.printStackTrace();
        this.lastErrorMsg = ne.text;
        this.debug(this.lastErrorMsg, "error");
    } finally {
        incinerate(wDoc, wView, wDb);
    }
    return result;
}

上述内容有几点值得解释一下:

  • 通常在Java中,我们在第一次使用时声明变量,而不是目录样式。但对于 Domino 对象,最好恢复到 TOC,这样,无论是否抛出异常,我们都可以在完成后尝试回收它们……因此使用了finally。
  • 返回对象(应该是一个项目值,而不是文档本身)也在目录中声明,因此我们可以在方法末尾返回该对象 - 再次,无论是否遇到异常(如果存在异常)例外,大概它仍然是空的)。
  • 此示例调用一个实用程序方法,该方法允许我们将所有 Domino 对象传递给单个方法调用以进行回收。

这是该实用方法的代码:

private void incinerate(Object... dominoObjects) {
    for (Object dominoObject : dominoObjects) {
        if (null != dominoObject) {
            if (dominoObject instanceof Base) {
                try {
                    ((Base)dominoObject).recycle();
                } catch (NotesException recycleSucks) {
                    // optionally log exception
                }
            }
        }
    }
}

它是私有的,因为我假设您只是在同一个 bean 中定义它,但最近我倾向于将其定义为 Util 类的公共静态方法,允许我从几乎任何地方遵循相同的模式。

最后一点:如果您要从配置文档中检索大量项目值,显然为您想要返回的每个项目值建立一个新的数据库、视图和文档句柄将是昂贵的。因此,我建议重写此方法以接受项目名称的 List (或 String[ ])并返回结果值的 Map 。这样,您可以为数据库、视图和文档建立单个句柄,检索所需的所有值,然后在实际使用返回的项值之前回收 Domino 对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java Bean 中回收 Domino 对象的最佳方法是什么 的相关文章

  • XPage:IBM OneUI 与 Bootstrap

    在不久的将来 我必须更新一个更大的 XPage 应用程序 开发时间超过三年 现在运行在Domino Server 8 5 3 FP6 to Domino Server 9 在此应用程序中我使用IBM OneUIv2 1但我不确定是否应该进一
  • 隐藏字段 $$viewid、$$xspsubmitid、$$xspexecid、$$xspsubmitvalue 和 $$xspsubmitscroll 的含义

    当我查看 XPage 的源代码时 我看到一些隐藏字段 viewid xspsubmitid xspexecid xspsubmitvalue and xspsubmitscroll 有一些文章像this and this这解释了 xspsu
  • 单击按钮即可 Xpages 更多字段(无限制)

    我想从 x 开始 xpage 应用程序上的字段 在我的应用程序中 我有一对文本数据字段和数字数据字段 比如说 10 对 然后当用户单击 更多字段 时 我希望动态显示更多对 而无需完整的字段刷新页面 但想要无限制 字段 只要页面不崩溃 然后我
  • 数据源上的 save() 方法不会触发 querySave/postSave 事件

    我的保存按钮使用 SSJS 和一些逻辑 我想保存数据源 所以我使用 document1 save 脚本有效 但 querySave postSave 代码未执行 唯一的解决方法是使用简单操作并将按钮事件划分为 执行脚本 保存文档 简单操作
  • 如何在 Lotus Domino 上设置 CORS?

    我尝试通过跨域请求通过 REST 与 Domino 进行通信 但遇到了问题 我已经设置了一个 Internet 站点文档 其中包含 IP 地址 本地主机和作为主机名列出的服务器名称 该网站正在按照我在该网站上设置的重定向规则运行 我还使用以
  • 将 inputRichText 绑定到 Bean

    我试图将 xp inputRichText 绑定到 bean ChatBean 但是当代码尝试将字段更新到 bean 时出现此验证错误 java lang IllegalArgumentException argument type mis
  • XPages - 仅在日期字段中保存日期

    我正在使用编辑框控件来显示日期字段 保存 XPage 时 我只想保存日期 现在日期和时间都被保存 有什么办法可以做到这一点吗 这是我的代码
  • Xpages 脱离服务器端缓存

    这个问题可能与非常具体的 Domino 版本有关 见下文 因此我从一些技术细节开始 有问题的服务器是虚拟化的 Windows 2008 R2 64 位计算机 多米诺骨牌发布是 IBM Domino r 服务器 64 位 适用于 Window
  • 如何关闭Notes客户端中的xpages?我使用 CSJS window.close 但它不起作用

    我正在做一个 xpinc 应用程序 我按照中的例子here并对其进行了修改 目前关闭按钮位于我的主页上 客户想要一个关闭按钮而不是普通的 X 来关闭 但该示例表明我应该创建 2 个 xpage 在第 1 页上我应该创建一个按钮window
  • xpages 视图面板列多值分隔符

    视图中有一列具有多值分隔符和新行 但是当我将此视图拖放到我的 XPage 中时 作为
  • 如何从 extlib 对话框中删除关闭图标?

    我正在使用 extlib 对话框组件来显示一些数据 我希望用户仅通过其中的按钮关闭对话框 我在标题栏中看不到任何禁用关闭图标的选项 有人可以指出我执行此操作的文档吗 到目前为止 我已经检查了 wiki extlib 书 也许我错过了 CSS
  • Xpage, createForm=false 禁用链接上的 SSJS 事件?

    我问这个只是为了在这里澄清 我不小心将 createForm 属性设置为 false 然后我期望一个链接事件应该打开另一个页面 但不再起作用 这是 SSJS 事件的预期行为吗 当您禁用表单创建时在链接中 正如 Per 提到的 所有事件都需要
  • 修复 IE 中“拉伸”的 XPage 扩展库名称选择器?

    Dalie 想出了一个很好的解决方案 当对话框出现在 IE 中时 可以阻止对话框 拉伸 到右侧 修复 IE 中 拉伸 的 XPage 扩展库对话框 https stackoverflow com questions 10456050 fix
  • 30 秒定期任务轮询外部 Web 服务和缓存数据

    我正在寻求一些关于从 Domino 服务器端操作每 30 秒轮询一次外部 Web 服务的建议 快速了解一下背景 我们通过 TomTom API 跟踪汽车的位置 我们现在需要在我们的网络应用程序中显示这一点 覆盖到地图 谷歌 必应等 上 并与
  • 按日期对 HashMap 进行排序

    在 Java 类中 我有一个按日期重新排序现有 HashMap 的方法 HashMap 是一种类型
  • 在数据库中使用DXL导入SSJS脚本库

    我们需要使用 DXL 在数据库中导入 SSJS 库 为此 我们编写了一个 Java 代理 其代码如下 import lotus domino public class JavaAgent extends AgentBase private
  • 当我从扩展库对话框保存文档时,某些值是空白的

    使用8 5 3 UP1 当我从对话框保存文档时 某些字段不会被填充 如果我从 xpage 中保存文档 它会很好地保存这些字段 下面用一个简单的例子来说明这个问题
  • 让应用程序布局与 Bootstrap 4 页面配合使用

    我使用的是 Domino 9 0 1 并成功安装了 Bootstrap Library 1 0 0 201403171254 在应用程序配置 Xsp 属性 常规下 我将主题设置为 bootstrapv3 1 1 并在应用程序配置 Xsp 属
  • 已安装 JDBC,但尝试连接到 Oracle 时出错

    扩展库附带的示例程序工作得很好 但是当我尝试连接到 Oracle 时 出现以下错误 读取关系数据时出错 加载连接 ojdbc14 时出错 加载 JDBC 驱动程序类 oracle jdbc Driver OracleDriver 时出错 如
  • 我可以在 dojo 手风琴中打开特定条目吗?

    我想在应用程序的左侧导航中放置链接 打开 xPage 并选择特定的手风琴条目 不知道该怎么做 有什么想法吗 我在这里假设您想以编程方式执行此操作 看看这个答案 https stackoverflow com a 1190455 104799

随机推荐

  • 如何获得行排名?

    HI 我昨天实际上发布了类似 或相同 的问题 但我认为我需要发布一个新问题 因为我有简短但明确的问题 我有下表 id point 1 30 2 30 3 29 4 27 5 28 6 26 我想要的是 获取所有用户按排名排序 用户 1 和
  • 多个 OpenGL 视图 (Cocos2D)

    Note 任何可以帮助我正确解决这个问题的人都会得到100点赏金 在我的应用程序中 我将 UIKit 与 Cocos2D 混合在一起 我使用 addSubview 和 removeFromSuperview 调用做了一些简单的自定义视图动画
  • 在 scalatest 中用什么代替符号?

    在 scalatest 中 您应该能够使用如下符号测试布尔属性 iter shouldBe traversableAgain 但这种表示法在最新版本的 scala 中已被弃用 所以现在你应该这样写 iter shouldBe Symbol
  • 对硬盘中的大量整数进行排序

    给定硬盘上 100 GB 整数数据 RAM 为 2 GB 如何以最少的磁盘操作对整数进行排序 这里从磁盘获取一个数字被视为一次磁盘操作 尽管实际上可以获取一块数据 我们可以使用磁盘上的额外空间进行临时存储 而不需要考虑清理已使用的临时空间的
  • Hibernate 显示真实的 SQL [重复]

    这个问题在这里已经有答案了 if I set
  • 如何配置 MVC6 应用程序以在 IIS 上运行?

    因此 我正在 Visual Studio 2015 中构建一个 MVC6 应用程序 并已设法解决大部分问题 但是 我尚未解决部署问题 在 MVC4 我之前使用的 中 我们的流程 发布到一个文件夹 然后在 IIS 中设置网站 右键单击Site
  • 在 python 中模拟传值行为

    我想模拟 python 中的按值传递行为 换句话说 我想绝对确保我编写的函数不会修改用户提供的数据 一种可能的方法是使用深复制 from copy import deepcopy def f data data deepcopy data
  • 线性布局和相对布局有什么区别?

    线性布局和相对布局有什么区别 LINEAR LAYOUT 在线性布局中 顾名思义 所有元素都是 以线性方式显示 水平或垂直 此行为设置为 android orientation 这是节点的一个属性 线性布局 线性布局将每个子元素一个接一个地
  • 如何在Python中使用react.js和Selenium从网页中抓取数据?

    我在抓取使用的网站时遇到一些困难react js并且不知道为什么会发生这种情况 This is the html of the website 我想做的是点击带有class play pause button btn btn naked 但
  • Wordpress 中的永久链接 - 找不到页面

    我已经搜索了几个小时 但没有找到任何似乎能够解决这个问题的东西 这是场景 我正在制作一个基于 二十一 主题的wp主题 一切都很顺利 直到我决定将网址更改为永久链接 唯一显示的页面是我之前定义的静态页面 我已经设置了 htaccess 文件
  • 关于 chomp 的澄清

    我现在正在放课 决定花时间学习 Perl 我正在使用 Beginning Perl http www perl org books beginning perl 我正在完成第三章末尾的练习 其中一项练习要求我 将重要的电话号码存储在哈希中
  • 如何使用 FontForge 从字体中删除连字

    我的字体有一些连字错误 这导致了问题我的安卓应用程序 我只想删除连字 我该如何在 FontForge 中做到这一点 这个问题是相关的 但它是相反的 Fontforge 脚本如何为字形添加连字 In 字体锻造 go to 元素 gt 字体信息
  • C# 中的图像调整大小 - 确定调整尺寸(高度和宽度)的算法

    我需要缩小高度或宽度大于预定义像素值的图像 我编写了一些代码来查看原始图像 检查宽度 高度或高度和宽度是否大于最大宽度 最大高度设置 我现在需要根据后一个值的最大值找出要调整大小的尺寸 例如 如果图像是900h x 300w最大高度是700
  • JavaScript 数字自相等[重复]

    这个问题在这里已经有答案了 我最近遇到了以下代码 function baseClamp number lower upper if number number if upper undefined number number lt uppe
  • Ruby - 优雅地比较两个枚举器

    我有来自 Ruby 1 9 2 中两个不同来源 二进制数据 的两个长数字流 这两个源被封装成两个形式枚举器 我想检查两个流是否完全相等 我提出了几个解决方案 但两者看起来都很不优雅 第一个只是将两者转换为数组 def equal strea
  • iOS 标签不使用 Swift 中的函数更新文本[重复]

    这个问题在这里已经有答案了 这个看似简单的问题让我发疯 我正在使用 SwiftyJSON 来获取远程数据 这是我在 Swift 中的 ViewController 类的片段 override func viewDidLoad super v
  • 如何模拟 Dagger 活动对象图?

    我在 Android 应用程序中使用 Dagger 来提供应用程序和活动范围图 我正在使用 Robolectric 进行单元测试 我知道我可以为 Robolectric 提供一个替代的 Application 类 该类配置有一个应用程序对象
  • 以自定义比例和间距将 ggplots 排列在一起

    我正在尝试将 n 个条形图与底部的一个通用标签图结合起来 我的问题是 grid arrange 将两个图合并为 50 50 我正在寻找类似布局矩阵的东西 您可以在其中指定 4 个插槽 前 3 个插槽由第一个图占用 最后一个插槽由第二个图占用
  • 批量终止进程并报告成功

    我有以下批处理文件 它会终止 iTunes 程序 因此 如果我连接 iPod 它就不会同步它 我知道你可以在 iTunes 中进行设置 echo off kill cls taskkill F IM itunes exe gt nul if
  • 在 Java Bean 中回收 Domino 对象的最佳方法是什么

    我使用一个函数来访问配置文档 private Document lookupDoc String key1 try Session sess ExtLibUtil getCurrentSession Database wDb sess ge