Oracle的数据库更改通知特性在插入、更新和删除行时发送rowis(物理行地址)。正如oracle文档中指出的那样,应用程序可以使用该特性来构建中间层缓存。但是,当我们详细了解行id是如何工作的时候,这似乎是矛盾的。
ROWID's(物理行地址)可以在执行各种数据库操作时更改,正如这个stackoverflow线程所指示的那样。除此之外,正如tom在这个线程中提到的,集群表可以有相同的row。
根据上述研究,使用数据库更改通知期间发送的rowid作为应用程序缓存中的键似乎不安全,对吧?这也提出了一个问题——是否应该使用数据库更改通知特性来构建应用服务器缓存?或者,当缓存对象的表发生任何导致row更改的操作时,是否建议重新启动所有应用服务器集群(以重新加载/刷新缓存)?对于生产环境来说,这是一个好的假设吗?
在我看来,没有任何可能改变ROWID的操作是在应用程序运行时在生产环境中执行的操作。此外,我看到过许多使用ROWID跨事务的高效软件(通常只有几秒钟或几分钟)。如果ROWID更改,该软件可能会在缓存之前失败。因此,基于更改通知创建数据库缓存对我来说似乎是合理的。只需提供一个关于ROWID的小免责声明。
唯一有点问题的操作是导致移动到另一个分区的更新。但这种情况很少发生因为它违背了分区的目的,至少如果它经常发生的话。特定数据库模式的设计人员将能够告诉您这样的操作是否可能发生,以及是否与缓存相关。如果所有表都没有设置ENABLE ROW MOVEMENT
,您甚至不需要询问设计师。
对于复制的rowid: rowid不是全局唯一的,它们在一个表中是唯一的。并且在更改通知中为您提供了ROWID和表名。因此,ROWID和表名的元组是构建可靠缓存的完美唯一键。