我正在尝试为Oracle DB中的表创建缓存。我使用DBMS_CHANGE_NOTIFICATION监视数据库中的更改,以自动更新缓存。
然而,只要我做的更新相当小,这只能以令人满意的方式工作 - 如果删除大部分行,则通知结构的ALL_ROWS标志设置为 true 并且ROWID的数组是 NULL 。
通过反复试验,我发现更新行数的阈值大约是100行,实际上太少了。如果一个表包含数百万行,并且我删除了一千个,那么我没有获得有关更新内容的信息,我必须刷新整个表的缓存,这是不可接受的。
我可以以某种方式更改此阈值吗?我在文档中找不到具体的答案:
如果ALL_ROWS(0x1)位置1,则表示整个表 被修改(例如,DELETE * FROM t)或行级粒度 通知中不要求或不提供信息 接收者必须保守地假设整个表有 已失效。
这只能给我一些模糊的信息。
答案 0 :(得分:2)
从docs我发现了这个:
如果在表操作标志中设置了ALL_ROWS位,则表示 表中的所有行都可能已被修改。在 除了TRUNCATE之类的操作,它会影响到的所有行 表,如果已滚动单个rowid,也可以设置此位 进入一个完整的表格无效。
如果在a中的给定表上修改了太多行,则会发生这种情况 单个事务(超过80个)或总共享内存 由于RDBMS上的rowid导致的消耗太大 (超过动态共享池大小的1%)。在这种情况下, 收件人必须保守地假设整个表已经存在 无效,回调/应用程序必须能够处理此问题 条件。
我在几年前推出了自己的解决方案,它给了我控制/灵活性,但也许有人为你做了一个解决方法(提交50个小块?但是如果你的应用不是唯一一个改变表怎么办? ?)。我认为重点是只缓存缓慢变化的表格,但这种限制对我来说似乎很愚蠢。
答案 1 :(得分:1)