我的程序人生

2011年8月14日 #

oracle 死锁查询及处理(转)

SELECT    bs.username "Blocking User", bs.username "DB User",
          ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
          bs.serial# "Serial#", bs.sql_address "address",
          bs.sql_hash_value "Sql hash", bs.program "Blocking App",
          ws.program "Waiting App", bs.machine "Blocking Machine",
          ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
          ws.osuser "Waiting OS User", bs.serial# "Serial#",
          ws.serial# "WSerial#",
          DECODE (wk.TYPE,
                  'MR', 'Media Recovery',
                  'RT', 'Redo Thread',
                  'UN', 'USER Name',
                  'TX', 'Transaction',
                  'TM', 'DML',
                  'UL', 'PL/SQL USER LOCK',
                  'DX', 'Distributed Xaction',
                  'CF', 'Control FILE',
                  'IS', 'Instance State',
                  'FS', 'FILE SET',
                  'IR', 'Instance Recovery',
                  'ST', 'Disk SPACE Transaction',
                  'TS', 'Temp Segment',
                  'IV', 'Library Cache Invalidation',
                  'LS', 'LOG START OR Switch',
                  'RW', 'ROW Wait',
                  'SQ', 'Sequence Number',
                  'TE', 'Extend TABLE',
                  'TT', 'Temp TABLE',
                  wk.TYPE
                 ) lock_type,
          DECODE (hk.lmode,
                  0, 'None',
                  1, 'NULL',
                  2, 'ROW-S (SS)',
                  3, 'ROW-X (SX)',
                  4, 'SHARE',
                  5, 'S/ROW-X (SSX)',
                  6, 'EXCLUSIVE',
                  TO_CHAR (hk.lmode)
                 ) mode_held,
          DECODE (wk.request,
                  0, 'None',
                  1, 'NULL',
                  2, 'ROW-S (SS)',
                  3, 'ROW-X (SX)',
                  4, 'SHARE',
                  5, 'S/ROW-X (SSX)',
                  6, 'EXCLUSIVE',
                  TO_CHAR (wk.request)
                 ) mode_requested,
          TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
          DECODE
             (hk.BLOCK,
              0, 'NOT Blocking',          /**//* Not blocking any other processes */
              1, 'Blocking',              /**//* This lock blocks other processes */
              2, 'Global',           /**//* This lock is global, so we can't tell */
              TO_CHAR (hk.BLOCK)
             ) blocking_others
     FROM v$lock hk, v$session bs, v$lock wk, v$session ws
    WHERE hk.BLOCK = 1
      AND hk.lmode != 0
      AND hk.lmode != 1
      AND wk.request != 0
      AND wk.TYPE(+) = hk.TYPE
      AND wk.id1(+) = hk.id1
      AND wk.id2(+) = hk.id2
      AND hk.SID = bs.SID(+)
      AND wk.SID = ws.SID(+)
      AND (bs.username IS NOT NULL)
      AND (bs.username <> 'SYSTEM')
      AND (bs.username <> 'SYS')
ORDER BY 1;

--------------------------------------------------------------------------------
查询发生死锁的select语句

select sql_text from v$sql where hash_value in 
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))


---------------------------------------------------------
关于数据库死锁的检查方法

一、         数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、         死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、         死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。
select sql_text from v$sql where hash_value in 
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

四、         死锁的解决方法
     一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

  1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

  2)kill掉这个死锁的进程:

  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

  3)如果还不能解决:

select pro.spid from v$session ses,
v$process pro where ses.sid=XX and 
ses.paddr=pro.addr;

  其中sid用死锁的sid替换:

exit
ps -ef|grep spid

  其中spid是这个进程的进程号,kill掉这个Oracle进程。

本文转自:http://sungang-82.iteye.com/blog/310781

posted @ 2011-08-14 21:52 lancey 阅读(595) | 评论 (0)编辑 收藏

2011年7月10日 #

ZK spring 当中@EventHandler不能生效的解决方案

最次换新东家。公司的管理系统用的是zk,而我又是喜欢使用spring的。
对于第一次使用zk,看了一次文档后,就想使用其自身提供的zk与spring的组合了。
所有的配置也完成了,但在@EventHandler上就是不生效
添加的事件不启动。看过源码后。
发现GenericSpringComposer.java当中
private void processEventsAnnotation(Component comp, String annotationValue, String mdname) {
        
if (annotationValue == null) {
            
return;
        }
        List
<String> annotationValueTokens = (List<String>) CollectionsX.parse(new ArrayList<String>(), annotationValue, ',');
        
for (String annotationValueToken : annotationValueTokens) {
            String srccompid 
= annotationValueToken.substring(0, annotationValueToken.indexOf('.'));
            String srcevt  
= annotationValueToken.substring(annotationValueToken.indexOf('.'+ 1, annotationValueToken.length());
            String eventName 
= srcevt + "." + srccompid;
            
Object o = SpringUtil.getBean(srccompid);
            
if(o instanceof Component) {
                Component c 
= (Component) o;
                List
<String> methodNames = eventsMap.get(eventName); 
                
if(methodNames == null) {
                    methodNames 
= new ArrayList<String>();
                    methodNames.add(mdname);
                    eventsMap.put(eventName, methodNames);
                } 
else {
                    methodNames.add(mdname);
                    eventsMap.put(eventName, methodNames);
                }
                comp.addEventListener(eventName, 
this);
                ((Component) o).addForward(srcevt, comp, eventName);
            }
        }
    }

看到上面的Object o = SpringUtil.getBean(srccompid);个人认为是从spring当中取bean来对比是否是Component。应该是从当前zul当中去取Component对象才对。
所以改这句为
Object o=comp.getFellow(srccompid);

再重新编译即可


posted @ 2011-07-10 20:58 lancey 阅读(326) | 评论 (0)编辑 收藏

2011年1月5日 #

Warning: initial dialog data is out of range.

在mfc Debug模式下出现"Warning: initial dialog data is out of range."提示。。
原因是出现在 DDV_MinMaxInt

对应的值在某个范围,但变量在初始化时值不在此范围内

posted @ 2011-01-05 17:39 lancey 阅读(1076) | 评论 (0)编辑 收藏

2010年11月28日 #

wtl 当中CUpdateUI 不定义情况

error C2504: “CUpdateUI”: 未定义基类
error C2143: 语法错误 : 缺少“,”(在“<”的前面)
error C3646: “END_UPDATE_UI_MAP”: 未知重写说明符
出现上面的情况时需要include <atlframe.h>头文件

posted @ 2010-11-28 11:40 lancey 阅读(752) | 评论 (0)编辑 收藏

2010年7月27日 #

libssl.a(s2_clnt.o): relocation R_X86_64_32 against

在linux 64bit上编译curl with-ssl时出现下面的错误

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/libssl.a(s2_clnt.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/libssl.a: could not read symbols: Bad value
collect2: ld returned 1 exit status


变更方法:
env PKG_CONFIG_PATH="openssl path" ./configure --disable-file --without-pic --disable-shared --with-ssl

posted @ 2010-07-27 10:20 lancey 阅读(1755) | 评论 (0)编辑 收藏

2010年4月8日 #

c++ 线程池的实现(原)

     摘要: 看群里有同志老是在找线程池的实现,听说网上曾经发布的都是不正确的,今天我就自己弄了一个,不正确的地方大家指点指点mutex.hxx 互斥类  1#ifndef INCLUDE_MUTEX_HH 2#define INCLUDE_MUTEX_HH 3#include <pthread.h> 4 5class...  阅读全文

posted @ 2010-04-08 15:43 lancey 阅读(6205) | 评论 (9)编辑 收藏

2010年3月19日 #

OOD设计原则

单一职责原则(SRP)
就一个类而言,应该只有一个引起变化的原因
如果你能想到多余一个的动机去改变一个类,
那么这个类就具有多于一个的职责。

开放封闭原则(OCP)
对于扩展是开放的
对于更改是封闭的

Liskov替换原则(LSP)
子类型(subtype)必须能够替换掉它们的基类型(base type)

依赖倒置原则(DIP)
高层模块不应该依赖于底层模块。二者都应该依赖于抽象

抽象不应该依赖于细节。细节应该依赖于抽象。
任何变量都不应该持有一个指向具体的指针或引用
任何类都不应该从具体类派生
任何方法都不应该覆写他的任何基类中的已经实现了的方法


接口隔离原则(ISP)
不应该强迫客户依赖于它们不用的方法

 

posted @ 2010-03-19 14:22 lancey 阅读(248) | 评论 (0)编辑 收藏

2009年3月26日 #

转载 配置多个jboss在同一机器上的端口号修改

jboss4.2

1.   $JBoss_home/server/default/deploy/ejb3.deployer/META-INF/jboss-service.xml
     修改3873端口的值;
2.   $JBoss_home/server/default/deploy/jboss-web.deployer/server.xml
     修改8080,8009,8443端口值。
3.   $JBoss_home/server/default/conf/jboss-service.xml
     修改8083,1098,1099,4444,4445,4446端口值
4.   $JBoss_home/server/default/conf/jboss-minimal.xml
     修改1099端口值,与3中保持一致。
5.   $JBoss_home/server/default/deploy/jms/uil2-service.xml
     修改8093端口值。

posted @ 2009-03-26 13:53 lancey 阅读(737) | 评论 (0)编辑 收藏

2009年1月13日 #

链接错误error LNK2005可能原因之一

lib工程里的"C/C++"->"Code Generation"->"Runtime Library"里面的内容和exe工程里面的内容不一致造成的

posted @ 2009-01-13 14:15 lancey 阅读(365) | 评论 (0)编辑 收藏

仅列出标题  

My Links

Blog Stats

常用链接

留言簿(2)

随笔档案

文章分类

文章档案

我的链接

搜索

最新评论

阅读排行榜

评论排行榜