Oracle数据库更改通知和ROWID';s

Oracle数据库更改通知和ROWID';s,oracle,rowid,Oracle,Rowid,Oracle在行插入、更新和删除时发送ROWID(物理行地址)。如oracle文档所示,应用程序可以使用此功能构建中间层缓存。但当我们详细了解行ID的工作方式时,这似乎是矛盾的 当按照指示执行各种数据库操作时,ROWID(物理行地址)可能会更改。除此之外,正如tom在本文中提到的,集群表可以具有相同的rowid 基于上述研究,使用数据库更改通知期间发送的rowid作为应用程序缓存中的键似乎不安全,对吗?这也提出了一个问题:是否应该使用数据库更改通知功能来构建应用程序服务器缓存?或者,当缓存对象的

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

当按照指示执行各种数据库操作时,ROWID(物理行地址)可能会更改。除此之外,正如tom在本文中提到的,集群表可以具有相同的rowid


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

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

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


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

为什么不依赖业务实体/域属性?我不完全理解您的建议。对于数据库更改通知,oracle只发送插入/更新行的rowid。无法将其配置为在该表中提供任何其他列信息。是的,为什么不在数据访问层上创建缓存层,依赖于业务数据,而不是与存储相关的数据。你认为你能比oracle更好地缓存数据吗?我认为你搞错了问题。我计划在应用服务器上为我的业务实体建立一个复制缓存。这是oracle数据库通知功能,它迫使用户使用与存储相关的信息(即rowids)作为缓存密钥。我确实了解了您的问题,并问您为什么不在更高的级别上构建缓存,这似乎更有效?听起来不错。在对这个主题进行更多研究时,我通过索引组织表(IOT)进行了研究。它们具有逻辑rowid,这些rowid可以更改,因为行是以排序方式存储的。因此,在使用DCN时,我们必须始终确保数据库表不是索引组织的表,对吗?