读书人

oracle11g缓存跟连接池-3

发布时间: 2013-10-07 19:41:22 作者: rapoo

oracle11g缓存和连接池-3

缓存与程序包变量

??? 对 SQL 结果缓存和 PL/SQL 函数缓存,您也可以使用程序包变量(可以是标量数据类型或 PL/SQL 集合)实现在内存中缓存值。应用程序可以访问变量,而不是表行或函数。因为基于内存,它的行为像缓存,那么 SQL 结果缓存添加了什么值?

??? 差别众多。对一个客户(假设 cust_id = 5)执行该函数后,从另一个 会话对同一客户执行该函数:

SQL> select get_tax_rate(&n) from dual
2 /
Enter value for n: 5
old?? 1: select get_tax_rate(&n) from dual
new?? 1: select get_tax_rate(5) from dual

GET_TAX_RATE(5)
---------------
????????????? 6

1 row selected.

Elapsed: 00:00:00.00

??? 注意执行时间,它表明结果源自缓存,而不是通过函数的执行。因此,尽管会话中没有缓存该函数,任一调用它的会话仍然可以从缓存中使用它。

??? 缓存针对数据库实例,而不是会话。这一让所有其他会话能使用一个会话中的缓存的能力极其不同于使用程序包变量在内存中保存值的方法,在这一方法中,变量只能在一个会话中可见。

??? 而且,程序包变量无法感知底层表的更改。当数据更改时,您需要手动刷新数据,否则应用程序将获取陈旧数据。在底层表数据更改时,SQL 结果缓存和 PL/SQL 函数缓存会自动刷新缓存,不需用户介入

?

Result-Cached Functions的一些限制

读书人网 >其他数据库

热点推荐