Oracle的
database change notification feature在行插入,更新和删除时发送rowid(物理行地址).如oracle文档中所示,应用程序可以使用此功能构建中间层缓存.但是,当我们详细了解行ID是如何工作时,这似乎是矛盾的.
当执行各种数据库操作时,ROWID(物理行地址)可以更改,如this stackoverflow thread所示.除此之外,在此thread群集表中提到的tom可以具有相同的rowid.
基于上述研究,将数据库更改通知期间发送的rowid用作应用程序缓存中的密钥似乎不安全吗?这也引发了一个问题 – 是否应该使用数据库更改通知功能来构建应用程序服务器缓存?或者当缓存对象的表经历任何导致rowid更改的操作时,是否建议重新启动所有应用程序服务器集群(以重新加载/刷新缓存)?这对于生产环境来说是一个很好的假设吗?
在我看来,任何可能改变ROWID的操作都不是在应用程序运行时在生产环境中执行的操作.此外,我已经看到很多高效的软件使用ROWID交易(通常只需几秒钟或几分钟).如果ROWID发生变化,那么该软件可能会在您的缓存之前失败.因此,基于更改通知创建数据库缓存对我来说似乎是合理的.只需提供有关ROWID的小型免责声明.
唯一有问题的操作是更新导致移动到另一个分区.但这很少发生,因为它破坏了分区的目的,至少如果它经常发生.特定数据库模式的设计者将能够告诉您此类操作是否可以发生并且与缓存相关.如果没有表设置ENABLE ROW MOVEMENT,您甚至不需要询问设计师.
至于复制ROWID:ROWID在全局范围内不是唯一的,它们在表中是唯一的.并且您在更改通知中同时获得ROWID和表名称.因此,ROWID和表名的元组是构建可靠缓存的完美唯一键.