`
liwenshui322
  • 浏览: 518978 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE 闩锁介绍

 
阅读更多

       oracle通过闩锁(latch)和锁定(lock)来实现资源的串行化。闩锁和锁定相同点是:都是用于实现保护数据的完整与准确性。不同点是:闩锁是一个低级别,轻量级的锁,获得和释放的速度非常快。而锁定则持续的时间较长,通过队列,按照先进先出的方式实现。可以这么说:闩锁是微观领域的,锁定则是宏观领域的。

      那闩锁到底起的是什么作用?这么说吧,只要涉及到内存地址的读和写,都需要通过获得闩锁(latch)来实现串行化。一次只能有一个服务器进程读或者写内存地址,这样就保证了存放在该内存地址数据的准确性。

      一个会话请求闩锁的时候,有可能这个闩锁正被其他会话占用。这个时候是否选择等待取决于你以什么模式请求闩锁,如果选择willing to wait(愿意等待),我们的会话就会睡眠一段时间继续请求。如果选择immediate(立即),我们的会话就会做其他的事情(比如获取另外一个相当的空闲闩),而不是等待这个闩直到可用。

      由于一个闩可能有很多会话在等待其变得可用,这些等待者是否会排队呢,比如先等的排在前面?其实这个不会,这些等待者是在不断重复请求这个闩锁的,一旦这个闩锁被释放,最先请求的就会先得到。

     那这些等待者是如何进行等待的呢?其实等待闩锁是一个开销比较大的事情,如果闩锁不可用,我们就得等待。在一台多cpu的机器上(如果单cpu,就没有等待闩锁这一说了),我们的会话就会自旋(spin)。

      什么叫做自旋?就是我们的会话不切出cpu,会一直呆在cpu上,不断循环请求得到这个闩。因为切出cpu,醒来之后又要调入cpu非常浪费时间,而且这个闩的持有者非常有可能正在另外一个cpu上忙于处理,而且会很快释放这个闩。大多数情况,我们的会话会很快得到这个闩的。如果请求很多次之后,还是不能得到这个闩,我们的会话就会进行睡眠,让出cpu。

      由此可以看出,即使有的时候我们的cpu看起来很忙,其实没干多少事情。如果你的程序写得足够糟糕,那cpu大多数的时间在不断循环请求闩锁,其实没干多少实际的工作。这就是为什么写sql语句最好用绑定变量的方法。

      下面我们做一个测试:。我们会把一个编写得很好的程序和一个编写得不太好的程序进行比较,前者使用了绑定变量,而在编写得不好的程序中,每条语句使用了SQL直接量或各不相同的SQL。为此,我们使用了一个很小的Java程序,它只是登录Oracle,关掉自动提交,并通过一个循环执行25 000条不同的INSERT语句。

 

     要评估这些程序以及它们在多用户环境中的行为,我们用Statspack来收集度量信息(什么是statspack参考我的这篇博文:http://liwenshui322.iteye.com/admin/blogs/1183027),

     如下:
(1) 执行一个Statspack快照来收集系统的当前状态。
(2) 运行程序的N个副本,每个程序向其自己的数据库表中插入(INSERT),以避免所有程序都试图向一个表中插入而产生的竞争。
(3) 在最后一个程序副本执行后,紧接着取另一个快照。
然后只需打印出Statspack报告,并查看完成N个程序副本需要多长时间,使用了多少CPU时间,主要的等待事件是什么,等等。

 

    使用绑定变量java源码:

package cn.netjava.latch; import java.sql.Connection; import java.sql.PreparedStatement; public class LatchTestMain { public static void main(String args[]) throws Exception{ Connection conn = ConnectOracle.getConn(); conn.setAutoCommit(false); String sql = "insert into latch_test1(id) values(?)"; PreparedStatement ps = conn.prepareStatement(sql); for(int i=0;i<25000;i++){ ps.setInt(1, i); ps.executeUpdate(); } conn.commit(); conn.close(); } }


 

 

不使用了绑定变量的java源码

package cn.netjava.latch; import java.sql.Connection; import java.sql.Statement; public class LatchTestMain { public static void main(String args[]) throws Exception{ Connection conn = ConnectOracle.getConn(); conn.setAutoCommit(false); Statement st = conn.createStatement(); for(int i=0;i<25000;i++){ String sql = "insert into latch_test1(id) values("+i+")"; st.execute(sql); } conn.commit(); conn.close(); } }

 

 


  

 

 

 

 

  不使用绑定变量与使用了绑定变量Statspack报告对比

 

   不使用绑定变量:

 使用绑定变量:



 

        对比可以看出1S硬解析的次数不是一个数量级的。

 

    不使用绑定变量

   

 
    使用绑定变量



 

   对比可以看出cpu的时间也有很大区别。说明如果不使用绑定变量,大部分时间都会耗在硬解析这项重复没有意义的事情上面。

 

   上面的报告都是单用户模式下(一个用户)。在实际情况当中,肯定是多用户模式了,假如我们一次跑4个程序副本看看报告是什么样子。

   不使用绑定变量

 

 

 

    使用绑定变量

 

 

 

   发现不使用绑定变量的话,随着用户的增加,硬解析次数也增加了。而使用了绑定变量的话,硬解析次数没有什么改变。在这里是0,因为我们以前跑过一次了。

 

  不使用绑定变量

 


 
 使用绑定变量

 


 
 对比单用户模式,不使用绑定变量的话,cpu耗时4用户是单用户的4倍多(理论上应该是4倍,至于多出来的时间,应该是耗在闩自旋上面了。)使用了绑定变量只有3倍。

   以共享池为例,我们来看闩自旋。

   单用户模式不使用绑定变量

  

  

   4用户模式不使用绑定变量

 


 

   很明显,对于shared pool 请求的次数后者是前者的4倍左右,但是Misses次数(请求闩锁失败)要高出好多,屡次请求不到而进入睡眠的也高出好多。由此可以看出,如果不使用绑定变量的话,在数以百计的用户同时访问的时候,简直是自寻死路。 同时访问的用户越多,闩自旋的概率越大,浪费cpu的时间就越多。
 

 

 

 

  • 大小: 57.5 KB
  • 大小: 32 KB
  • 大小: 19.2 KB
  • 大小: 61.7 KB
  • 大小: 34.1 KB
  • 大小: 55.7 KB
  • 大小: 32.2 KB
  • 大小: 57.6 KB
  • 大小: 57 KB
  • 大小: 34.2 KB
  • 大小: 18.1 KB
1
2
分享到:
评论
1 楼 jierui 2013-04-11  

相关推荐

    Oracle数据库性能优化实务闩锁及闩锁优化.ppt

    Oracle数据库性能优化实务闩锁及闩锁优化 Oracle数据库性能优化实务闩锁及闩锁优化是指在Oracle数据库中对性能的优化,以提高数据库的执行效率和稳定性。闩锁是一种机制,用于保护Oracle数据库的核心内存结构,防止...

    Oracle数据库性能优化实务闩锁及闩锁优化.pptx

    Oracle数据库性能优化实务中,闩锁(Latch)与闩锁优化是关键的议题。闩锁是一种轻量级的锁机制,用于保护Oracle数据库内部的数据结构,确保并发访问时的一致性和完整性。它们主要分为三类:应用级锁、数据字典锁和...

    Oracle数据库性能优化实务_闩锁及闩锁优化.pptx

    Oracle数据库性能优化实务主要关注的是闩锁(LATCH)及其优化,这关乎数据库系统的稳定性和效率。闩锁是Oracle数据库内部用于控制并发访问共享内存结构的一种机制,它们确保了核心内存访问的一致性和高效性。 ...

    Oracle数据库的锁类型

    Oracle数据库的锁类型大致可以分为三类:DML锁、DDL锁和内部锁与闩锁。DML锁(数据锁)主要用于保护数据的完整性,DDL锁(字典锁)用于保护数据库对象的结构,如表、索引等,而内部锁和闩锁则用于保护数据库的内部...

    闩锁锁定和并发性实用教案.pptx

    在Oracle数据库系统中,为了确保多用户环境下的数据一致性,防止并发操作导致的冲突,Oracle采用了一种称为“闩锁”(latch)的机制。闩锁是一种轻量级的锁,主要用于内存资源的分配与释放,以及并发访问的控制,尤其...

    oracle数据库闩锁锁定与并发专题.doc

    在这个专题中,我们主要探讨的是Oracle数据库中的闩锁(Latch)和锁定(Lock)机制,这两种机制都是为了实现并发操作的串行化,防止数据的破坏。 首先,串行化是数据库管理系统中确保数据安全的重要原则,即使在多...

    Oracle的锁机制

    根据保护的对象,Oracle的锁分为内部锁、闩、DDL锁和DML锁。内部锁和闩是系统内部管理的,用于保护数据库的内部结构。DDL锁保护数据库对象的结构,如表和索引的定义,自动在执行SQL定义语句时添加。DML锁则直接作用...

    ORACLE锁深入分析

    进一步细分,Oracle的锁可以分为DML锁、DDL锁和内部锁与闩。DML锁用于保护数据的完整性,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁在执行DML语句时自动申请,对整个表进行锁定,分为SS、SX、S、X四种模式。...

    ORACLE数据库并发访问控制机制及访问冲突的解决方法.pdf

    在介绍ORACLE数据库并发访问控制机制及访问冲突的解决方法之前,首先需要了解ORACLE数据库的基础知识。作为全球知名的关系型数据库产品,ORACLE数据库具备出色的数据库管理能力、超强的稳定性和良好的并发控制机制,...

    Oracle8i Internal Services

    ### Oracle8i内部服务:等待、闩锁、锁定与内存管理 #### 一、引言 《Oracle8i Internal Services for Waits, Latches, Locks, and Memory》是一本专注于Oracle8i内部机制的书籍,它深入探讨了数据库管理系统在...

    Oracle8i Internal Services for Waits, Latches, Locks,and Memory

    ### Oracle8i内部服务:等待、闩锁、锁定与内存管理关键知识点解析 #### 标题及描述概览 本书《Oracle8i Internal Services for Waits, Latches, Locks, and Memory》由Steve Adams撰写,是针对Oracle数据库内部...

    oracle锁机制_bzm整理1

    - 内部锁和闩:保护数据库内部结构,如缓存、数据块等。 4. **DML锁的实现**: - TM锁(Table Locks):表级锁,用于确保表结构不被用户修改。TM锁分为共享锁(S锁)和排他锁(X锁)。 - TX锁(Transaction ...

    oracle8i.internal.services.for.waits.latches.locks.pdf

    《Oracle8i内部服务:等待、锁、闩锁与内存》是Steve Adams撰写的一本深入探讨Oracle数据库内部机制的专业书籍,特别聚焦于Oracle8i版本(发布于1999年)中的等待、锁、闩锁以及内存管理等关键主题。这本书由O'...

    oracle锁机制

    Oracle数据库的锁又细分为不同的类别,如DML锁(数据锁)、DDL锁(字典锁)以及内部锁和闩。DML锁主要用于确保数据操作时的完整性,其中TM锁(表级锁)和TX锁(事务锁或行级锁)是核心部分。TM锁在事务开始时获取,...

    清除Oracle中长时间持锁的session

    - **CHILD_LATCH**: 保护对象的子闩锁编号。 - **INVALIDATIONS**: 命名空间内对象因依赖对象修改而被标记为无效的总次数。 #### 找出具体的会话ID (SID) 一旦确定了锁定的对象,接下来需要找出具体是哪个会话(即...

    Oracle.Core:Essential.Internals.for.DBAs.and.Developers

    锁和闩锁是Oracle数据库中用于控制并发访问的重要机制。锁主要用于控制对数据的访问,防止多个事务同时修改同一数据,从而避免数据不一致的问题。闩锁则是一种轻量级的锁,主要用于保护共享内存结构免受并发访问的...

    oracle入门及提高

    "10-闩锁、锁定和并发性.ppt"关注了Oracle的并发控制机制,包括行级锁定、表锁定以及各种类型的闩锁,这些内容对于处理多用户环境下数据的并发访问至关重要。 "13-手工管理的备份恢复.ppt"和"14-RMAN管理的备份和...

    Oracle Core Essential Internals for DBAs and Developers-colour

    锁是数据库管理中保证数据一致性和隔离性的重要工具,闩锁则是Oracle内部用来同步对内存中数据结构的访问的一种机制。 5. 缓存和复制(Caches and Copies) - 数据库缓存是提高数据库性能的关键部分,第五章将讨论...

Global site tag (gtag.js) - Google Analytics