1.2.7.5 其他?
此外,某些特定的SQL,较大的指针或者大的Package都可能导致ORA-04031错误。在很多ERP软件中,这样的情况非常常见。在这种情况下,可以考虑把这个大的对象Pin 到共享池中,减少其动态请求、分配所带来的负担。?
使用dbms_shared_pool.keep 系统包可以把这些对象pin 到内存中,最常见的SYS.STANDARD、SYS.DBMS_STANDARD等都是常见的候选对象。
注意:要使用DBMS_SHARED_POOL系统包,首先需要运行dbmspool.sql脚本,该脚本会自动调用prvtpool.plb 脚本创建所需对象。?
引发ORA-04031 错误的因素还有很多,通过设置相关参数如session_cached_cursors、cursor_space_for_time等也可以解决一些性能问题并带来针对性的性能改善,这里不再过多讨论。?
1.2.8 Library Cache Pin 及Library Cache Lock分析?
Oracle使用两种数据结构来进行Library Cache的并发访问控制:lock 和 pin。
Lock可以被认为是解析锁,而Pin则可以被认为是以读取或改变对象内容为目的所加的短时锁。之所以将Library Cache Object对象分开,使用多个锁定来保护,其中的一个重要目的就是为了提高并发。
Lock比Pin具有更高的级别。Lock在对象handle上获得,在pin一个对象之前,必须首先获得该handle的锁定。Handle可以理解为Libray Cache对象的Buffer Header,其中包含了库缓存对象的名称、标记、指向具体对象的内存地址指针等信息。
再次引用一下前文曾经提到的图表,通过下图我们可以清晰的看到Object Handles和Heaps的关系:

锁定主要有三种模式: Null,share,Exclusive。在读取访问对象时,通常需要获取Null(空)模式以及share(共享)模式的锁定。在修改对象时,需要获得Exclusive(排他)锁定。Library Cache Lock根本作用就是控制多个Oracle客户端对同一个Library Cache对象的并发访问,通过对Library Cache Object Hadle上加锁来防止非兼容的访问。
常见的使用或保护包括:
1. 一个客户端防止其他客户端访问同一对象
2. 一个客户端可以通过锁定维持相对长时间的依赖性(例如,防止其他客户端修改对象)
3. 当在Library Cache中定位对象时也需要获得这个锁定?
在锁定了Library Cache对象以后,一个进程在访问之前必须pin该对象。同样pin有三种模式,Null,shared和exclusive。只读模式时获得共享pin,修改模式获得排他pin。通常我们访问、执行过程、Package时获得的都是共享pin,如果排他pin被持有,那么数据库此时就要产生等待。
为了实现更好的性能,从Oracle10gR2开始,Library Cache Pin已经逐渐被互斥机制(Mutex)所取代,在Oracle Database 11g中,这个变化就更为明显。
1.2.8.1 LIBRARY CACHE PIN等待事件
library cache pin是用来管理library cache的并发访问的,pin一个Object会引起相应的heap被载入内存中(如果此前没有被加载),pins可以在Null、Share、Exclusive这3个模式下获得,可以认为pin是一种特定形式的锁。
当library cache pin等待事件出现时,通常说明该pin被其他用户已非兼容模式持有。library cache pin的等待时间为3秒钟,其中有1秒钟用于PMON后台进程,即在取得pin之前最多等待3秒钟,否则就超时。
ibrary cache pin的参数有P1(KGL Handle Address)、P2(Pin Address)和P3(Encoded Mode & Namespace), 常用的主要是P1和P2
library cache pin通常是发生在编译或重新编译PL/SQL、VIEW、TYPES等Object时。?
当Object变得无效时,Oracle会在第一次访问此Object时试图去重新编译它,如果此时其他session已经把此Object pin到library cache 中,就会出现问题,特别时当有大量的活动session并且存在较复杂的dependence时。在某种情况下,重新编译Object可能会花几个小时时间,从而阻塞其他试图去访问此Object的进程。
recompile过程包含以下步骤:
(1)存储过程的library cache object以排他模式被锁定,这个锁定是在handle上获得的。Exclusive 锁定可以防止其他用户执行同样的操作,同时防止其他用户创建新的引用此过程的对象。
(2)以Shared模式pin该对象,以执行安全和错误检查。
(3)共享pin被释放,重新以排他模式pin该对象,执行重编译。
(4)使所有依赖该过程的对象失效。
(5)释放Exclusive Lock和Exclusive Pin。
从Oracle 10g开始,以上测试将不会看到同样的效果,这是因为Oracle 10g对于