Oracle 数据库更改通知和 ROWID

Posted

技术标签:

【中文标题】Oracle 数据库更改通知和 ROWID【英文标题】:Oracle Database Change Notification and ROWID's 【发布时间】:2011-09-18 12:50:10 【问题描述】:

Oracle 的database change notification feature 在行插入、更新和删除时发送rowid(物理行地址)。如 oracle 的文档中所述,应用程序可以使用此功能来构建中间层缓存。但是,当我们详细了解行 ID 的工作原理时,这似乎是矛盾的。

如this *** thread 所示,当执行各种数据库操作时,ROWID(物理行地址)可能会发生变化。除此之外,正如汤姆在此thread 中提到的那样,聚簇表可以具有相同的 rowid。

根据上面的研究,使用在数据库更改通知期间发送的rowid作为应用程序缓存中的键似乎并不安全,对吧?这也引发了一个问题——是否应该使用数据库更改通知功能来构建应用程序服务器缓存?或者当缓存对象的表经历任何导致rowid改变的操作时,是否建议重新启动所有应用程序服务器集群(以重新加载/刷新缓存)?对于生产环境,这是一个很好的假设吗?

【问题讨论】:

为什么不依赖业务实体/域属性? 我没有完全理解你的建议。使用数据库更改通知,oracle 仅发送插入/更新行的 rowid。它无法配置为在该表中提供任何其他列信息。 是的,为什么不在数据访问层上创建缓存层,依赖于业务数据,而不是与存储相关的数据。你认为你可以比 oracle 更好地缓存数据吗? 我认为你的问题是错误的。我计划在应用服务器上为我的业务实体建立一个复制缓存。这是 oracle 数据库通知功能,它强制使用存储相关信息(即 rowids)作为缓存键。 我确实收到了您的问题,并问您为什么不在更高级别上构建缓存,这似乎更有效? 【参考方案1】:

在我看来,任何可能更改 ROWID 的操作都不是在应用程序运行时在生产环境中执行的操作。此外,我见过很多使用 ROWID 跨事务的高效软件(通常只需几秒钟或几分钟)。如果 ROWID 更改,该软件可能会在您的缓存之前失败。因此,基于更改通知创建数据库缓存对我来说似乎是合理的。只需提供一个关于 ROWID 的免责声明即可。

唯一有点问题的操作是更新导致移动到另一个分区。但这种情况很少发生,因为它违背了分区的目的,至少如果它经常发生的话。特定数据库模式的设计者将能够告诉您这种操作是否会发生以及是否与缓存相关。如果没有一张表设置了ENABLE ROW MOVEMENT,你甚至不需要问设计师。

关于重复的 ROWID:ROWID 不是全局唯一的,它们在表中是唯一的。您会在更改通知中同时获得 ROWID 和表名。所以ROWID和表名的元组是构建可靠缓存的完美唯一键。

【讨论】:

听起来不错。在对这个主题进行更多研究时,我通过了索引组织表 (IOT)。它们具有可以更改的逻辑 rowid,因为行以排序方式存储。所以在使用 DCN 时,我们必须始终确保数据库表不是索引组织表,对吧?

以上是关于Oracle 数据库更改通知和 ROWID的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库中rowid啥作用????!!!!!谢谢!!!!

informix/oracle rowid 问题

Oracle数据库的伪列

在Oracle中有个rowid和rownum,他们是一样的吗?有啥作用?大神求解!!!

oracle用rowid去掉重复值

Oracle中的rownum和rowid