2

作为我们应用程序的一部分,我们使用 Jackrabbit (1.6.4) 来存储文档。我们的应用程序检索到的每个文档都被放入 Jackrabbit 中的文件夹结构中,如果不存在则创建该文件夹结构。

我们的 DBA 注意到以下查询对持有 Jackrabbit 模式的 Oracle (11.2.0.2.0) 数据库执行了很多 - 每小时超过 50000 次,导致数据库上的大量 IO。事实上,它是经过时间的 IO(97% IO)方面排名前 5 位的 SQL 语句之一:

    select BUNDLE_DATA from VERSION_BUNDLE where NODE_ID = :1

查看数据库,您会注意到该表最初只包含一条记录,包括node_id(数据类型 RAW)键和DEADBEEFFACEBABECAFEBABECAFEBABE值,然后是bundle_dataBLOB 列中的几个字节。稍后,将添加更多记录以及其他数据。

该表的 SQL 如下所示:

CREATE TABLE "VERSION_BUNDLE"
(    
    "NODE_ID" RAW(16) NOT NULL ENABLE,
    "BUNDLE_DATA" BLOB NOT NULL ENABLE
);

我有以下问题:

  • 为什么 Jackrabbit 如此频繁地访问此表?
  • 任何 Jackrabbit 调整选项可以使这更快吗?
  • Jackrabbit 是否完全更改了该BUNDLE_DATA值,还是仅在每次访问存储库时读取该值?
  • 有没有办法调整数据库模式以使其更好地处理这种情况?

更新:该表最初仅包含一条记录,随着时间的推移添加更多记录,由 Jackrabbit 内部决定。在大多数情况下,访问似乎仍然是只读的,因为插入或更新语句未报告为以高数量运行。

4

4 回答 4

2

这是物理 I/O 还是逻辑 I/O?随着数据被读取,如果块在缓存中的老化速度足够快以至于需要物理 i/o,我会感到惊讶。

于 2012-06-11T12:03:39.970 回答
1

为什么 Jackrabbit 如此频繁地访问此表?

这表明您正在存储库中创建版本。这是您的应用程序应该做的事情吗?

任何 Jackrabbit 调整选项可以使这更快吗?

不是我知道的;调查的一种选择是升级到更新的 Jackrabbit 版本。2.4.2 版刚刚发布,1.6.4 版已经快两年了。这些版本之间可能存在性能改进。

Jackrabbit 是否更改了 BUNDLE_DATA 值,还是只是在每次访问存储库时读取它?

从外观上看,它是根存储库节点的 GUID。

有没有办法调整数据库模式以使其更好地处理这种情况?

据我所知,模式是由 Jackrabbit 自动生成的,因此唯一的选择是在创建表定义后以兼容的方式修改表定义。但这是 DBA 的主题,而我不是。

于 2012-06-11T13:02:39.473 回答
1

为什么 Jackrabbit 如此频繁地访问此表?

我们已经看到,即使您不要求版本,也经常访问此表。从 Jackrabbit 用户邮件列表中查看此线程

于 2019-01-24T11:30:58.567 回答
1

如果 JCR-Store 基于 Oracle 数据库,您可以重新组织基础表。

  1. 构建该表的哈希集群以防止索引访问
  2. 检查您是否有使用分区选项的许可
  3. 通过删除应用程序行中不必要的版本将被删除(版本修剪)

如果您要存储图片、文档等二进制对象 - 只需查看 VERSION_BINVAL。

于 2016-03-01T18:16:17.363 回答