【发布时间】:2011-09-18 12:50:10
【问题描述】:
Oracle 的database change notification feature 在行插入、更新和删除时发送rowid(物理行地址)。如 oracle 的文档中所述,应用程序可以使用此功能来构建中间层缓存。但是,当我们详细了解行 ID 的工作原理时,这似乎是矛盾的。
如this stackoverflow thread 所示,当执行各种数据库操作时,ROWID(物理行地址)可能会发生变化。除此之外,正如汤姆在此thread 中提到的那样,聚簇表可以具有相同的 rowid。
根据上面的研究,使用在数据库更改通知期间发送的rowid作为应用程序缓存中的键似乎并不安全,对吧?这也引发了一个问题——是否应该使用数据库更改通知功能来构建应用程序服务器缓存?或者当缓存对象的表经历任何导致rowid改变的操作时,是否建议重新启动所有应用程序服务器集群(以重新加载/刷新缓存)?对于生产环境,这是一个很好的假设吗?
【问题讨论】:
-
为什么不依赖业务实体/域属性?
-
我没有完全理解你的建议。使用数据库更改通知,oracle 仅发送插入/更新行的 rowid。它无法配置为在该表中提供任何其他列信息。
-
是的,为什么不在数据访问层上创建缓存层,依赖于业务数据,而不是与存储相关的数据。你认为你可以比 oracle 更好地缓存数据吗?
-
我认为你的问题是错误的。我计划在应用服务器上为我的业务实体建立一个复制缓存。这是 oracle 数据库通知功能,它强制使用存储相关信息(即 rowids)作为缓存键。
-
我确实收到了您的问题,并问您为什么不在更高级别上构建缓存,这似乎更有效?