SELECT sn.username, m.SID,sn.SERIAL#, m.TYPE, DECODE (m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode, LTRIM (TO_CHAR (lmode, '990')) ) lmode, DECODE (m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', request, LTRIM (TO_CHAR (m.request, '990')) ) request, m.id1, m.id2 FROM v$session sn, v$lock m WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞 OR ( sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定 AND m.request = 0 AND lmode != 4 AND (id1, id2) IN ( SELECT s.id1, s.id2 FROM v$lock s WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2) )ORDER BY id1, id2, m.request;
通过以上查询知道了sid和 SERIAL#就可以开杀了 alter system kill session 'sid,SERIAL#';ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4:Share 共享锁(S):阻止其他DML操作,share 5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive 6:exclusive 独占(X):独立访问使用,exclusive 数字越大锁级别越高, 影响的操作越多。
星期四, 十月 26, 2006
星期五, 十月 13, 2006
20061013:一个java IO的问题
环境是这样的:
有两台应用服务器,一台文件服务器.业务需求是用户访问应用服务器,提交图片,统一保存到文件服务器.路径保存到数据库.然后客户可以提交查找需求到应用服务器,应用服务器则读取文件服务器的图片,返回到客户.
三台机器都是linux,在同一网段内,并且在文件服务器运行nfs服务端,共享一个目录,两个客户端都挂载该共享目录.
但是,很不幸,有问题:提交文件到共享目录总是失败。但是如果是提交到应用服务器本机则没有问题。
找了很久才发现,原来是File.renameTo()方法的问题。
在Windows操作系统下,File类的renameTo方法可以用来改名或者移动文件,在同一个目录下renameTo方法起的作用是改名,在不同目录下起的作用是移动。
但是这个方法在Linux下工作却不是这样的,在linux系统下renameTo方法只能起到改名作用,而无法移动文件,也就是说当源文件和目标文件不在同一个目录时,该方法无法工作。
因此如果用到该方法时请一定注意这个差异,在linux下移动文件必须自己写代码来实现或者执行操作系统的移动文件的命令。
参考文档:http://www.javayou.com/html/diary/showlog.vm?sid=2&cat_id=-1&log_id=1494
有两台应用服务器,一台文件服务器.业务需求是用户访问应用服务器,提交图片,统一保存到文件服务器.路径保存到数据库.然后客户可以提交查找需求到应用服务器,应用服务器则读取文件服务器的图片,返回到客户.
三台机器都是linux,在同一网段内,并且在文件服务器运行nfs服务端,共享一个目录,两个客户端都挂载该共享目录.
但是,很不幸,有问题:提交文件到共享目录总是失败。但是如果是提交到应用服务器本机则没有问题。
找了很久才发现,原来是File.renameTo()方法的问题。
在Windows操作系统下,File类的renameTo方法可以用来改名或者移动文件,在同一个目录下renameTo方法起的作用是改名,在不同目录下起的作用是移动。
但是这个方法在Linux下工作却不是这样的,在linux系统下renameTo方法只能起到改名作用,而无法移动文件,也就是说当源文件和目标文件不在同一个目录时,该方法无法工作。
因此如果用到该方法时请一定注意这个差异,在linux下移动文件必须自己写代码来实现或者执行操作系统的移动文件的命令。
参考文档:http://www.javayou.com/html/diary/showlog.vm?sid=2&cat_id=-1&log_id=1494
星期三, 十月 11, 2006
20061011:数值表示
编程卓越之道笔记.
一.数/字符串转换
十进制数字组成的字符串转换为一个整型数的算法
1.将变量设置为0
2.如果串中没有数字了,则算法结束,该变量存储的就是对应的数
3.从串中取下一个数字(从左到右)
4.将变量乘10,在加上步骤3中取道的数字
5.回到第2步
整型数转换为字符串
1.初始化一个空字符串
2.如果整数为0,则输出0,算法结束
3.将当前的数除以10,得到商和余数
4.将余数(0..9)转换成一个字符,放到字符串的尾部
5.如果商不为0,则将商作为新的整型数,重复3-5步;如果商为0则结束转换
6.将字符串中的字符逆序输出
二.有符号数和无符号数
1.大多数计算机采用二进制补码系统来表示有符号数.使用n位可用表示范围在-2^(n-1)到+2^(n-1)-1内的数.
2.二进制补码系统采用在最高位作为符号位.如果是0,表示非负;如果是1,表示负数.
3.二进制补码表示的数的取负,算法为:将该数所有位取反,然后加1.考虑溢出,我们不允许对二进制补码计数系统中的最小值取负.例如:16位的二进制补码系统中的-32768(%1000_0000_0000_0000),取反后为(%0111_1111_1111_1111),再加1为(%1000_0000_0000_0000),即-32768.显然取负失败.
一.数/字符串转换
十进制数字组成的字符串转换为一个整型数的算法
1.将变量设置为0
2.如果串中没有数字了,则算法结束,该变量存储的就是对应的数
3.从串中取下一个数字(从左到右)
4.将变量乘10,在加上步骤3中取道的数字
5.回到第2步
整型数转换为字符串
1.初始化一个空字符串
2.如果整数为0,则输出0,算法结束
3.将当前的数除以10,得到商和余数
4.将余数(0..9)转换成一个字符,放到字符串的尾部
5.如果商不为0,则将商作为新的整型数,重复3-5步;如果商为0则结束转换
6.将字符串中的字符逆序输出
二.有符号数和无符号数
1.大多数计算机采用二进制补码系统来表示有符号数.使用n位可用表示范围在-2^(n-1)到+2^(n-1)-1内的数.
2.二进制补码系统采用在最高位作为符号位.如果是0,表示非负;如果是1,表示负数.
3.二进制补码表示的数的取负,算法为:将该数所有位取反,然后加1.考虑溢出,我们不允许对二进制补码计数系统中的最小值取负.例如:16位的二进制补码系统中的-32768(%1000_0000_0000_0000),取反后为(%0111_1111_1111_1111),再加1为(%1000_0000_0000_0000),即-32768.显然取负失败.
星期二, 十月 10, 2006
20061010:java集合
一.java主要集合类之间的关系
二.Set
Set继承自Collection,集合中对象不排序,并且没有重复的对象.Set有两个实现类:HashSet,TreeSet.
Set中存放对象的引用,并且没有重复的对象.向Set中添加一个对象引用的时候,Set判断是否已经存在,用的是对象的equals方法,而不是操作符==.
1.HashSet
HashSet按照哈希算法来存取集合中的对象.当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法获得哈希码,然后根据哈希码计算出存放的位置.
为保证HashSet正常使用,要求当两个对象用equals比较结果为true时,其hashCode也要相等.即:
如果obj1.equals(obj2)==true,那么obj1.hashCode()==obj2.hashCode().
2.TreeSet
插入TreeSet的对象,要求实现Comparable接口.
注意:equals和==的区别:
1.==可以对基本类型(int,double,char等),引用类型进行比较.
如果是比较基本类型,则看其值是否相等.
如果是比较引用类型,则看两边是否引用同一对象.
2.equals只能对引用类型进行比较.
当比较双方是引用自同一个对象,则返回true.否则false.
说明:上面的equals方法是Object的equals方法,如果某些类覆盖了Object的equals方法,则会有不同的比较规则.比如java的包装类和String类都覆盖了equals方法,只要内容一致,就算对象不同也返回true.
三.List
List继承自Collection
List以线性方式存储,允许存放重复对象.实现类包括:ArrayList,LinkedList.
ArrayList随机访问元素速度较快,插入与删除较慢.
LinkedList随机访问元素较慢,插入与删除较快.
为List排序,可借助Collections类和Comparator接口.
Collections.sort(List list);//对List中对象进行自然排序
Collections.sort(List list,Comparator comparator)//对List中对象进行客户化排序
四.Map
Map不继承自Collection.
Map是把键(Key)对象和值(Value)对象进行映射的集合.通过put(Object key,Object value)方法向集合中加入元素,通过get(Object key)方法来检索对应的值对象.
Map集合中键对象不允许重复,值对象可以重复.
Map的entrySet()方法返回一个Set集合.
Map的两种实现:HashMap和TreeMap.
五.HashSet和HashMap的负载因子
HashMap和HashSet都有如下属性
容量capacity:哈希表中桶的数量
初始容量initial capacity:创建HashSet和HashMap时的桶的数量.在HashSet和HashMap的构造方法中允许设置初始值.
大小size:元素的数量
负载因子:size/capacity.越小负载越轻.HashSet和HashMap默认的负载因子为0.75,即当负载因子到了0.75时,HashSet和HashMap自动成倍增加容量.
六.集合使用类Collections
Collections类中有一些专门用于操纵List的方法,有一部分用于操纵所有Collection类型和Map类型的方法.
操纵List的方法:
copy(List dest,List src)//把一个List中的元素拷贝到另一个List中.
fill(List list,Object o)//向列表中填充元素
sort(List list)//对List中的元素进行自然排序
binarySearch(List list,Object key)//查找List中与给定对象key相同的元素.在调用该方法时,必须保证List中元素已经自然排序.
binarySearch(List list,Object key,Comparator c)//同上,但必须保证List元素已经按照Comparator类型参数的比较规则排序.
操纵Collection类型或者Map类型的方法:
Object max(Collection coll)//返回集合中最大元素,按自然排序
Object max(Collection coll,Comparator comp)//返回集合中最大元素,按指定规则
Object min(Collection coll)//
Object min(Collection coll,Comparator comp)//
Set singleton(Object o)//返回一个不可变的Set集合,它只包含一个对象o
List singletonList(Object o)//返回一个不可变的List集合,它只包含一个对象o
Map singletonMap(Object key,Object value)//返回一个不可变的Map集合,它只包含指定的键key和值value.
二.Set
Set继承自Collection,集合中对象不排序,并且没有重复的对象.Set有两个实现类:HashSet,TreeSet.
Set中存放对象的引用,并且没有重复的对象.向Set中添加一个对象引用的时候,Set判断是否已经存在,用的是对象的equals方法,而不是操作符==.
1.HashSet
HashSet按照哈希算法来存取集合中的对象.当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法获得哈希码,然后根据哈希码计算出存放的位置.
为保证HashSet正常使用,要求当两个对象用equals比较结果为true时,其hashCode也要相等.即:
如果obj1.equals(obj2)==true,那么obj1.hashCode()==obj2.hashCode().
2.TreeSet
插入TreeSet的对象,要求实现Comparable接口.
注意:equals和==的区别:
1.==可以对基本类型(int,double,char等),引用类型进行比较.
如果是比较基本类型,则看其值是否相等.
如果是比较引用类型,则看两边是否引用同一对象.
2.equals只能对引用类型进行比较.
当比较双方是引用自同一个对象,则返回true.否则false.
说明:上面的equals方法是Object的equals方法,如果某些类覆盖了Object的equals方法,则会有不同的比较规则.比如java的包装类和String类都覆盖了equals方法,只要内容一致,就算对象不同也返回true.
三.List
List继承自Collection
List以线性方式存储,允许存放重复对象.实现类包括:ArrayList,LinkedList.
ArrayList随机访问元素速度较快,插入与删除较慢.
LinkedList随机访问元素较慢,插入与删除较快.
为List排序,可借助Collections类和Comparator接口.
Collections.sort(List list);//对List中对象进行自然排序
Collections.sort(List list,Comparator comparator)//对List中对象进行客户化排序
四.Map
Map不继承自Collection.
Map是把键(Key)对象和值(Value)对象进行映射的集合.通过put(Object key,Object value)方法向集合中加入元素,通过get(Object key)方法来检索对应的值对象.
Map集合中键对象不允许重复,值对象可以重复.
Map的entrySet()方法返回一个Set集合.
Map的两种实现:HashMap和TreeMap.
五.HashSet和HashMap的负载因子
HashMap和HashSet都有如下属性
容量capacity:哈希表中桶的数量
初始容量initial capacity:创建HashSet和HashMap时的桶的数量.在HashSet和HashMap的构造方法中允许设置初始值.
大小size:元素的数量
负载因子:size/capacity.越小负载越轻.HashSet和HashMap默认的负载因子为0.75,即当负载因子到了0.75时,HashSet和HashMap自动成倍增加容量.
六.集合使用类Collections
Collections类中有一些专门用于操纵List的方法,有一部分用于操纵所有Collection类型和Map类型的方法.
操纵List的方法:
copy(List dest,List src)//把一个List中的元素拷贝到另一个List中.
fill(List list,Object o)//向列表中填充元素
sort(List list)//对List中的元素进行自然排序
binarySearch(List list,Object key)//查找List中与给定对象key相同的元素.在调用该方法时,必须保证List中元素已经自然排序.
binarySearch(List list,Object key,Comparator c)//同上,但必须保证List元素已经按照Comparator类型参数的比较规则排序.
操纵Collection类型或者Map类型的方法:
Object max(Collection coll)//返回集合中最大元素,按自然排序
Object max(Collection coll,Comparator comp)//返回集合中最大元素,按指定规则
Object min(Collection coll)//
Object min(Collection coll,Comparator comp)//
Set singleton(Object o)//返回一个不可变的Set集合,它只包含一个对象o
List singletonList(Object o)//返回一个不可变的List集合,它只包含一个对象o
Map singletonMap(Object key,Object value)//返回一个不可变的Map集合,它只包含指定的键key和值value.
星期一, 十月 09, 2006
20061009:java异常处理的笔记
今天上午看孙卫琴的"java 面向对象编程"中的异常处理章节.
一.java异常类:
1.Throwable是所有异常类的根类.下面有两格直接子类:Error和Exception.
Error表示程序本身无法恢复的严重错误,比如内存不足等.
Exception表示程序本身还可以处理的异常.
2.Exception的子类可以分为两类:运行时异常和受检查异常.
2.1运行时异常(RuntimeException)
此类异常java编译不会检查,当程序中可能出现这种异常,既没有用try ...catch去捕捉,也没有throws声明抛出,还是会通过java编译器的编译的.比如
public class WithRuntimeEx{
public int divide(int a,int b){
if(b==0) throw new IllegalArgumentException("除数不能为0!");
return a/b;
}
public static void main(String[] args){
new WithRuntimeEx().divide(1,0);
System.out.println("End");
}
}
上面的代码执行的结果是:
Exception in thread "main" java.lang.IllegalArgumentException:除数不能为0!
at WithRuntimeEx.divide(WithRuntimeEx.java:3)
at WithRuntimeEx.main(WithRuntimeEx.java:7)
2.2受检查异常
出去RuntimeException及其子类之外的所有异常,都属于受检查异常(Checked Exception).他们会被java编译器检查出来.因此在程序中要么用try...catch捕获,要么用throws声明并抛出.
2.3RuntimeException(及其子类)和Error(及其子类)的区别:
两者相同点:java编译器都不会检查他们
两者区别:Error由java虚拟机抛出,应用程序一般不扩展Error类.RuntimeException由应用程序抛出.可以扩展.
二.Java异常处理机制
1.java虚拟机的方法调用栈(method invocation stack)
java虚拟机的方法调用栈用来跟踪每个线程中一系列的方法调用过程.该堆栈保存了每个调用方法的本地信息(比如方法的局部变量).每个线程都有独立的方法调用栈.对于主线程,堆栈的底部是程序的入口方法main().当新调用一个方法时,java虚拟机把该方法的栈结构置入栈顶.当该方法执行完毕后,java虚拟机会从调用栈中弹出该方法的栈结构.然后处理此刻的方法(即调用刚才被弹出方法的方法).
当方法中出现异常的时候,有两种处理方法:
a.在当前方法中通过try...catch来捕获并处理异常.
b.在方法的声明处通过throws声明抛出异常.如
public void methodA(int money) throws SpecialException{
//以下代码可能抛出SpecialException
if(--money<=0) throw new SpecialException("Out of money");
}
2.运用java异常处理机制
java异常处理机制的关键字:try catch finally throw throws
a.finally是在任何情况下都要执行的语句,除非System.exit(),或者断电.
b.finally中不要使用return.否则可能覆盖try...catch中的return值,或者丢失异常.
c.异常处理的一个基本点是自己能处理的异常自己处理,自己不能处理的则抛出.
d.throw和throws的区别:如果一个方法可能出现异常,但没有能力处理这种异常,则在方法声明处用throws来抛出异常;throw则是用来抛出异常.
三.异常处理原则:
1.异常只能用于非正常情况
2.为异常提供文档
3.尽可能避免异常
4.保持异常的原子性
5.避免过于庞大的try代码块
6.在catch中指定具体的异常类型
7.不要在catch代码块中忽略被捕获的异常
四.其它
异常链
处理多样化异常
一.java异常类:
1.Throwable是所有异常类的根类.下面有两格直接子类:Error和Exception.
Error表示程序本身无法恢复的严重错误,比如内存不足等.
Exception表示程序本身还可以处理的异常.
2.Exception的子类可以分为两类:运行时异常和受检查异常.
2.1运行时异常(RuntimeException)
此类异常java编译不会检查,当程序中可能出现这种异常,既没有用try ...catch去捕捉,也没有throws声明抛出,还是会通过java编译器的编译的.比如
public class WithRuntimeEx{
public int divide(int a,int b){
if(b==0) throw new IllegalArgumentException("除数不能为0!");
return a/b;
}
public static void main(String[] args){
new WithRuntimeEx().divide(1,0);
System.out.println("End");
}
}
上面的代码执行的结果是:
Exception in thread "main" java.lang.IllegalArgumentException:除数不能为0!
at WithRuntimeEx.divide(WithRuntimeEx.java:3)
at WithRuntimeEx.main(WithRuntimeEx.java:7)
2.2受检查异常
出去RuntimeException及其子类之外的所有异常,都属于受检查异常(Checked Exception).他们会被java编译器检查出来.因此在程序中要么用try...catch捕获,要么用throws声明并抛出.
2.3RuntimeException(及其子类)和Error(及其子类)的区别:
两者相同点:java编译器都不会检查他们
两者区别:Error由java虚拟机抛出,应用程序一般不扩展Error类.RuntimeException由应用程序抛出.可以扩展.
二.Java异常处理机制
1.java虚拟机的方法调用栈(method invocation stack)
java虚拟机的方法调用栈用来跟踪每个线程中一系列的方法调用过程.该堆栈保存了每个调用方法的本地信息(比如方法的局部变量).每个线程都有独立的方法调用栈.对于主线程,堆栈的底部是程序的入口方法main().当新调用一个方法时,java虚拟机把该方法的栈结构置入栈顶.当该方法执行完毕后,java虚拟机会从调用栈中弹出该方法的栈结构.然后处理此刻的方法(即调用刚才被弹出方法的方法).
当方法中出现异常的时候,有两种处理方法:
a.在当前方法中通过try...catch来捕获并处理异常.
b.在方法的声明处通过throws声明抛出异常.如
public void methodA(int money) throws SpecialException{
//以下代码可能抛出SpecialException
if(--money<=0) throw new SpecialException("Out of money");
}
2.运用java异常处理机制
java异常处理机制的关键字:try catch finally throw throws
a.finally是在任何情况下都要执行的语句,除非System.exit(),或者断电.
b.finally中不要使用return.否则可能覆盖try...catch中的return值,或者丢失异常.
c.异常处理的一个基本点是自己能处理的异常自己处理,自己不能处理的则抛出.
d.throw和throws的区别:如果一个方法可能出现异常,但没有能力处理这种异常,则在方法声明处用throws来抛出异常;throw则是用来抛出异常.
三.异常处理原则:
1.异常只能用于非正常情况
2.为异常提供文档
3.尽可能避免异常
4.保持异常的原子性
5.避免过于庞大的try代码块
6.在catch中指定具体的异常类型
7.不要在catch代码块中忽略被捕获的异常
四.其它
异常链
处理多样化异常
订阅:
博文 (Atom)