6

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

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

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

4

1 回答 1

5

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

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

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

于 2011-09-18T13:39:10.457 回答