??xml version="1.0" encoding="utf-8" standalone="yes"?>蜜桃a∨噜噜一区二区三区,日韩一区二区三,手机看片福利在线观看http://www.aygfsteel.com/lgcpeter/生活在北京,感觉北京不是很适合生活Q适合做javazh-cnWed, 18 Jun 2025 06:45:06 GMTWed, 18 Jun 2025 06:45:06 GMT60Pow2ACL学习W记之一http://www.aygfsteel.com/lgcpeter/archive/2005/08/27/11315.htmlfreshboyfreshboySat, 27 Aug 2005 07:06:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/27/11315.htmlhttp://www.aygfsteel.com/lgcpeter/comments/11315.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/27/11315.html#Feedback0http://www.aygfsteel.com/lgcpeter/comments/commentRss/11315.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/11315.html一直以来想做一个用上一些开源成熟框架的论坛Q往往在权限这一块卡住,有幸到Pow2ACLq个开源项目,于是分几ơ研I一下,作ؓ自己通用代码的一个收藏和U篏?BR>Pow2ACL  是实现访问控制列?ACL)的一个java包?BR>主要是对三个对象斚w的控Ӟ用户Q角色和讉K权限?BR>控制动作主要是:
1、用户对应对某个动作的访问权限;
2、用户对应的是那个角Ԍ
3、角色所对应的动作访问权限?BR>   分析可见Q一切都是围l用h讄的,如下图所C:

                                                                                    acl实体关系?BR>



freshboy 2005-08-27 15:06 发表评论
]]>
what is AspectJ?(?http://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11214.htmlfreshboyfreshboyFri, 26 Aug 2005 08:00:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11214.htmlhttp://www.aygfsteel.com/lgcpeter/comments/11214.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11214.html#Feedback1http://www.aygfsteel.com/lgcpeter/comments/commentRss/11214.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/11214.html|上出现了很多讲解AspectJ的资料,但大多是从讲解AspectJ语法开?本文从另一个角度讲解AspectJQ作者着重介l了AspectJ的设计思\和运行原理?BR>1. ?BR>Aspect Oriented Programming (AOP)是近来一个比较热门的话题?

AspectJ是AOP的Java语言的实玎ͼ获得了JavaE序员的q泛x?

关于AspectJ和AOP的具体资料,请从下列链接中查找:

http://www.eclipse.org/aspectj/
http://www.parc.com/research/csl/projects/aspectj/
http://aosd.net/

|上出现了很多讲解AspectJ的资料,但大多是从讲解AspectJ语法开始,然后讲解如何应用AspectJQ如何分Y件开发过E的不同斚wQAspectQ?-LogQSessionQAuthentication and AuthorizationQTransactionQ等{?

初次接触AspectJ的读者看到这些资料(或者语法手册)Q会感到AspectJ有些秘。他们想知道QAspectJ是如何做到这些的QAspectJ是怎样工作的?AspectJ需要特D的q行环境吗?

本文从另一个角度讲解AspectJQ本文从讲解AspectJ的设计思\、运行原理入手,回答上述问题?

本文讲解的主要内容,按照概念的重要程度,排列如下Q?

AspectJ是一个代码生成工PCode GeneratorQ?
AspectJ语法是用来定义代码生成规则的语法。您如果使用qJava Compiler Compiler (JavaCC)Q您会发玎ͼ两者的代码生成规则的理忉|人相伹{?
AspectJ有自q语法~译工具Q编译的l果是Java Class文gQ运行的时候,classpath需要包含AspectJ的一个jar文gQRuntime libQ?
AspectJ和xDoclet的比较。AspectJ和EJB Descriptor的比较?
本文的原则是Q只l讲其他资料没有讲到的东西,其他资料讲过的东西,不讲或略讌Ӏ以节省|络资源Q更Z节省大家宝贵的时间。J

2QAspect Oriented Programming (AOP)
本节单介lAOP的概念,解释我们Z么需要AOP?

AOP是Object Oriented ProgrammingQOOPQ的补充?/P>

OOP能够很好地解军_象的数据和封装的问题Q却不能很好的解决AspectQ?斚w"Q分ȝ问题。下面D例具体说明?/P>

比如Q我们有一个BankQ银行)cRBank有两个方法,depositQ存钱)和withdrawQ取钱)?

cdҎ的定义如下:


Code 2.1 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 增加account账户的钱敎ͼq回账户里当前的钱数
}

public float withdraw(AccountInfo account, float money){
  // 减少account账户的钱敎ͼq回取出的钱?BR>}
};

 


q两个方法涉及到用户的̎戯金等重要信息Q必要非常心Q所以编写完上面的商业逻辑之后Q项目负责h又提Z新的要求--lBankcȝ每个重要Ҏ加上安全认证Ҏ?

于是Q我们不得不分别在上面的两个Ҏ中加入安全认证的代码?

cdҎ的定义如下:Q新增加的代码用不同的背景标出)


Code 2.2 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 验证account是否为合法用?BR>  // 增加account账户的钱敎ͼq回账户里当前的钱数
}

public float withdraw(AccountInfo account, float money){
  // 验证account是否为合法用?BR>  // 减少account账户的钱敎ͼq回取出的钱?BR>}
};

 


q两个方法都需要操作数据库Qؓ了保持数据完整性,目负责人又提出了新的要?-lBankcȝ每个操作数据库的Ҏ加上事务控制?

于是Q我们不得不分别在上面的两个Ҏ中加入安全认证的代码?

cdҎ的定义如下:Q新增加的代码用不同的背景标出)


Code 2.3 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 验证account是否为合法用?BR>  // Begin Transaction
  // 增加account账户的钱敎ͼq回账户里当前的钱数
  // End Transaction
}

public float withdraw(AccountInfo account, float money){
  // 验证account是否为合法用?BR>  // Begin Transaction
  // 减少account账户的钱敎ͼq回取出的钱?BR>  // End Transaction
}
};

 


我们看到Q这些与商业逻辑无关的重复代码遍布在整个E序中。实际的工程目中涉及到的类和函敎ͼq远不止两个。如何解册U问题?

我们首先来看看OOP能否解决q个问题?

我们利用Design Pattern的Template PatternQ可以抽Z个框Ӟ改变上面的例子的整个设计l构?

cdҎ的定义如下:


Code 2.4 Base.java
abstract class Base{
public float importantMethod(AccountInfo account, float money){
  // 验证account是否为合法用?BR>  // Begin Transaction
 
  float result = yourBusiness(account, money)

  // End Transaction
  return result; 
}

protected abstract float yourBusiness(AccountInfo account, float money);
};

Code 2.5 BankDeposit.java
class BankDeposit extends Base{
protected float yourBusiness(AccountInfo account, float money){
  // 增加account账户的钱敎ͼq回账户里当前的钱数
}
};

Code 2.6 BankWithdraw.java
class BankWithdraw extends Base{
protected float yourBusiness(AccountInfo account, float money){
  // 减少account账户的钱敎ͼq回取出的钱?BR>}
};

 


q里我们用一U很勉强的方法实C认证和事务代码的重用。而且Q有心的读者可能会注意刎ͼq种Ҏ的前提是Q强制所有的Ҏ都遵守同Lsignature?

如果有一个{账方法transfer(AccountInfo giver, AccountInfo receiver, float money)Q由于transferҎ的signature不同于yourBusiness的signatureQ这个方法无法用上面的框架?

q个例子中提到的认证Q事务等斚wQ就是AOP所兛_的Aspect?

AOP是Z解决q种问题而出现的。AOP的目的就?-Separation of Aspects (or Separation of Concerns).

下面的章节,解释EJB DescriptorQAspectJQxDoclet{工具如何解决Separation of Aspects的问题?

3QEJB Descriptor
如果我们使用EJB实现上面的例子,Bankcd以作Z个Stateless Session Bean实现?

在Bank的代码中只用考虑商业逻辑Q不用考虑认证和事务等斚w?

认证和事务等斚w在EJB Descriptor中定义,由EJB Container提供q些斚w的实现?

我们来看一下,如何使用EJB Descriptor描述上面的例子?

EJB Descriptor包括一个ejb-jar.xml文g。ejb-jar.xml文g包含两大部分Qenterprise-beans和assembly-descriptor部分。enterprise-beans部分包含EJB的定?-JNDI NameQEJB Home, Interface, Bean Class Path{;assembly-descriptor部分包括配置信息的定?-安全角色Q事务控制等{?

下面l出上面例子对应的模拟EJB Descriptor?


<ejb-jar>
<enterprise-beans>
  <session>
     <ejb-name>Bank</ejb-name>
     ?BR>     <ejb-class>example.Bank</ejb-class>
     <session-type>Stateless</session-type>
     <transaction-type>Container</transaction-type>
<security-role-ref>
<role-name>bank-account</role-name>
</security-role-ref>
  </session>
</enterprise-beans>

<assembly-descriptor>
  <security-role>
    <role-name>bank-account</role-name>
  </security-role>

<method-permission>
<role-name>employee</role-name>
<method>
<ejb-name>Bank</ejb-name>
<method-name>deposit</method-name>
</method>
<method>
<ejb-name>Bank</ejb-name>
<method-name>withdraw</method-name>
</method>
</method-permission>

<container-transaction>
<method>
<ejb-name>Bank</ejb-name>
<method-name>deposit</method-name>
</method>
<method>
<ejb-name>Bank</ejb-name>
<method-name>withdraw</method-name>
</method>

<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>

 

本文后面会讲到如何用AspectJ实现上例中的Separation of Aspects?

读者可以比较一下AspectJ语法和EJB Descriptor定义之间的对应关pR?

两者都提供了类名、方法名的匹配规则,能够把类的方法映到认证Q事务等AspectQ方面)?

4QAspectJ
q一节我们来看看AspectJ如何实现上例中的Separation of Aspects?

使用AspectJQ我们不用对原有的代码做M修改Q就可以Z码提供不同的AspectQ方面)--比如Q认证,事务{?

我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect?


Code 4.1 AuthAspect.java
aspect AuthAspect{
  pointcut bankMethods() : execution (* Bank.deposit(?) || execution (* Bank. withdraw (?);

  Object around(): bankMethods(){
  // 验证account是否为合法用?/P>

  return proceed();
  }
};

Code 4.2 TransactionAspect.java
aspect TransactionAspect{
  pointcut bankMethods() : execution(* Bank.deposit(?) || execution (* Bank. withdraw (?);

  Object around(): bankMethods(){
  // Begin Transaction
  Object result = proceed();
  // End Transaction
  return result;
  }
};

 

如果您暂时不能理解这D代码,没有关系Q后面会讲到Q这些aspect的定义,不过是定义了一些代码生成规则?

我们用AspectJ~译器编译Bank文g和含有aspect的这个文Ӟ出来的结果就是带有安全认证和事务处理的BankcR编译出来的q个Bankc调用了AspectJ Runtime LibQ所以,如果你要q行q个Bankc,你需要把AspectJ Runtime Lib讄在你的classpath里面?

我们来看看,AspectJ~译器ؓ我们做了什么事情?

首先QAspectJ从文件列表里取出所有的文g名,然后dq些文gQ进行分析?
AspectJ发现一些文件含有aspect的定义,在这个例子里Q就是AuthAspect和TransactionAspect的定义;q些aspect是代码生成规则?
AspectJҎq些aspect代码生成规则Q修Ҏ加你的源代码。在q个例子里,是修改dBank文g?
AspectJdAuthAspect的定义,发现了一个pointcut--bankMethods()Q这个pointcut的定义是execution(* Bank.deposit(?) || execution(* Bank. withdraw (?)Q表C所有对Bankcȝdeposit和withdrawҎ的执行点?
AspectJl箋dAuthAspect的定义,发现了一个around()Q这在AspectJ中叫做AdviceQ我不明白ؓ什么叫q个名字Q不q没关系Q我们只要知道它是干什么的p了。Advice允许你在某个cȝҎ的调用之前或调用之后Q加入另外的代码。Code 4.1所CZ码中的around()? // 验证account是否为合法用?部分Q就是要加入的代码。这D代码要加在哪里呢?around()后面跟了一个pointcut--bankMethods()。根据这个pointcutQAspectJ会把q段代码加入到Bank.deposit和Bank.withdraw两个Ҏ的执行之前。达到的效果如同Code 2.2所C?
AspectJdTransactionAspect的定义,象第Q?Q步一P发现了发C一个pointcut--bankMethods()?
AspectJl箋dAuthAspect的定义,发现了一个around()。这ơAspectJ?Begin Transaction"?End Transaction"两段代码加在Bank.deposit和Bank. withdraw两个Ҏ的执行前后。达到的效果如同Code 2.3所C?
如何验证q一点?您可以到 http://www.eclipse.org/aspectj/下蝲安装AspectJQ编译里面的SampleQ把~译l果反编译一下,可以看到AspetJ自动生成的代码?

我们看到QAspectJ是一U代码自动生成工兗你~写一D通用的代码,比如认证斚w的代码,事务斚w的代码,然后ҎAspectJ语法定义一套代码生成规则(aspect定义Q,AspectJ׃帮助你自动把q段通用代码分布到对应的代码里面去,单快P无遗策?

无独有偶Q一个著名的~译器生成工?-Java Compiler Compiler (JavaCC)Q也采用了非常相似的代码生成机制。JavaCC允许你在语法定义规则文g中,加入你自qJava代码Q用来处理读入的各种语法元素?

AspectJ令你的代码更_Q结构更良好。AspectJ的好处,我就不多说了Q网上很多精彩的文章探讨AspectJ的各U用途?

下面介绍一个著名的代码自动生成?-xDocletQ和EJB DescriptorQAspectJ之间的联pd比较?

5QxDoclet
我们知道QDoclet用来生成JavadocQxDoclet是Doclet的扩展,不仅仅能生成JavadocQ还能够生成源代码和配置信息{?

Doclet和xDoclet的工作原理,是处理源代码中的注释中的tagQ生成相应的信息。这些tag都以@开_你可以自己定义tag和对tag的处理,生成自定义的信息?

Q这里提一下Apache Maven Project。Maven是一UProject Build工具。用Mavenq行理的项目,能够同时生成Javadoc和XRef。XRef是Source Code Cross Reference?

JBoss利用xDoclet为EJB自动生成EJB Home和EJB Object Interface源文Ӟ和EJB Descriptor文g?

在Sourceforge.net上看C个叫做Barter的开源项目,利用xDoclet为类Ҏ生成AspectJ代码?

h意,EJB Descriptor和AspectJ都是把方斚w面的Aspects集中在一处进行管理,而xDoclet的思想是处理散布在源代码中的各Utag?

xDoclet在生成EJB Descriptor和AspectJ{方面的应用Q正应了中国的一句古?-分久必合Q合久必分?

6Qȝ
开源项目的出现Q打破了软g技术领域的众多壁垒Q推动Y件技术进E的日新月异?

同时Q一些新名词Q新概念也层ZIP令hD~ؕQ无所适从。其实,很多东西都是换汤不换药,我们理解应用q些新技术的时候,要抓住本质,要破除迷信,破除MZؓ的神U感?

举个例子Q现在炒作的很热的一些概念,"Web Service"Q还?Grid Computation"Q网D)Q都是基于原有的各种技术发展出来的。媒体和技术文章不应该Zؓ地制造Q何神U感?

互联|时代的权威Q不是说出来的,而是做出来的?

另外Q围l着一些有前途的新技术,M出现大量?快速入门手?Q有些简直就是对该技术帮助文档的译Q而且Q有隑ֺ的地Ҏ有翻译出来,大家都明白的地方译得非常详,详尽C没有必要的地步。这U因为市场需求而生的应景时文Q大量地出现在技术文章领域?

W者对本文的期望是Q决不迷信,决不重复。ƈ试图引入一U洁净的,毫无废话的文风。笔者期待一针见血的驳斥和批评?

Enjoy it. J
Thanks.

关于作?BR>王v?普通程序员?
Powered by Open Source。致力于做一个ArchitectQSolution ProviderQBest Practice Provider?
希望有一天,有够的旉Q精力和能力的时候,把自己有限的一w所学的一点东西全部A献给Open Source Project?
 



freshboy 2005-08-26 16:00 发表评论
]]>
求最公倍数的java实现http://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11209.htmlfreshboyfreshboyFri, 26 Aug 2005 07:55:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11209.htmlhttp://www.aygfsteel.com/lgcpeter/comments/11209.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/26/11209.html#Feedback1http://www.aygfsteel.com/lgcpeter/comments/commentRss/11209.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/11209.html        
 1 /**
 2  * 
 3  */
 4 package com.lgc.interview;
 5 
 6 /**
 7  * @author lgcpeter
 8  * 求三个数的最公倍数
 9  */
10 public class ThreeMulti {
11 
12     /**
13      * @param a,b
14      * @return
15      * 求两个数的最大公U数
16      */
17     public int gongYue(int a,int b){
18         int m = 1;
19         //如果a于b则交换位|?/SPAN>
20         if(a<b){
21             m = a;
22             a = b;
23             b = m;
24         }
25         while(m != 0){
26             m = a%b;
27             a = b;
28             b = m;
29         }
30         return a;
31     }
32     
33     /**
34      * @param a,b
35      * @return
36      * 求两个数的最公倍数
37      */
38     public int gongBei(int a,int b){
39         int gb = 0;
40         gb = a*b/gongYue(a,b);
41         return gb;
42     }
43     
44     /**
45      * @param a,b,c
46      * @return
47          * 三个数的最公倍数
48      */
49     public int threeGB(int a,int b,int c){
50         int t = 0;
51         int mid = 0;
52         mid = this.gongBei(a,b);
53         t = this.gongBei(mid,c);
54         return t;
55     }
56 }


freshboy 2005-08-26 15:55 发表评论
]]>
W一ơ亲密接触phphttp://www.aygfsteel.com/lgcpeter/archive/2005/08/25/11105.htmlfreshboyfreshboyThu, 25 Aug 2005 10:00:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/25/11105.htmlhttp://www.aygfsteel.com/lgcpeter/comments/11105.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/25/11105.html#Feedback0http://www.aygfsteel.com/lgcpeter/comments/commentRss/11105.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/11105.html最q一D|间总迸发出自己造论坛的念头Q但业务旉不合适,扼杀再摇中了。偶焉到hibernate的论坛,发现java的大师们所用的论坛是php造的Q心里不免有些^衡,我也走捷径了Q?BR> 在国外一个website(www.phpbb.com)下蝲了整个程序,开始了first kiss to php!
    首先Q配|php环境?BR>    其次Q安装论坛?BR>    最后,q管理员界面q行理配置?/P>

freshboy 2005-08-25 18:00 发表评论
]]>
oracle锁机??http://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10941.htmlfreshboyfreshboyWed, 24 Aug 2005 10:04:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10941.htmlhttp://www.aygfsteel.com/lgcpeter/comments/10941.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10941.html#Feedback0http://www.aygfsteel.com/lgcpeter/comments/commentRss/10941.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/10941.html昨天M个公叔R试,问到Oracle的封锁机Ӟ呵呵Q理Z的问题好久都没有学习了,书本的东西也差不多都q给了大学的老师。回来翻了一下书本,扑ֈ了关于这部分知识的说明,贴出来供大学参考。(现在的公司,都不知道他们h什么样的hQ本来是应聘软g开发的Q却因ؓ我说会OracleQ却问我好多Oracle理论上的知道Q如上)Q?

讄锁机制主要是ؓ了对q发操作q行控制Q对q扰q行锁Q保证数据的一致性和准确性。Oracle数据库封锁方式有三种Q共享封锁,独占锁Q共享更新封?
[b:8f4f63b9bb]锁cd[/b:8f4f63b9bb]
Oracle RDBMS的封锁类型可分ؓ如下三类Q?

Q、内部񔞮锁
内部U封锁是用于保护ORACLE内部l构Q由pȝ内部实现Q用户不能访问,因此我们不必Ҏ做过多的了解?

Q、DDLU封锁(字典/语法分析锁Q?
DDLU封锁也是由ORACLE RDBMS来控Ӟ它用于保护数据字典和数据定义改变时的一致性和完整性。它是系l在对SQL定义语句作语法分析时自动地加锁,无需用户q予。字?语法分析锁共分三类Q?
Q1Q、字典操作锁Q用于对字典操作Ӟ锁住数据字典Q此锁是独占的Q从而保护Q何一个时M能对一个字典操作?
Q2Q、字典定义锁Q用于防止在q行字典操作时又q行语法分析Q这样可以避免在查询字典的同时改动某个表的结构?
Q3Q、表定义锁:用于 一个SQL语句正当讉K某个表时Q防止字怸与该表有关的目被修攏V?

Q、DMLU封?
DMLU封锁用于控制ƈ发事务中的数据操U,保证数据的一致性和完整性,其封锁对象可以是表或行?
对用L数据操纵QOracle可以自动为操U늚数据q行锁Q但如果有操U|权,则ؓ满q发操纵的需要另外实施封锁。DML锁可由一个用戯E以昑ּ的方式加锁,也可通过某些SQL语句隐含方式实现?BR>DML锁有如下三种锁方式Q?
Q?Q、共享封锁方式(SHAREQ?
Q?Q、独占封锁方式(EXCLUSIVEQ?
Q?Q、共享更新封锁(SHARE UPDATEQ?

其中SHAREQEXCLUSIVE用于表封锁,SHARE UPDATE用于行封锁?
1、共享方式的表封?
׃n方式的表锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已锁的表q行更更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁Q共享更新锁可以再施加,但不允许持有׃n更新锁的进E做更新。共享该表的所有用户只能查询表中的数据Q但不能更新。共享方式的表封锁只能由用户用SQL语句来设|,句格式如下:
[quote:04b72348bd]LOCK TABLE <表名>[,<表名>]...
IN SHARE MODE [NOWAIT]
[/quote:04b72348bd]
执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择NOWAITQ若该封锁暂时不能施加成功,则返回ƈq户决定是q行{待Q还是先L行别的语句?
持有׃n锁的事务Q在出现如下之一的条件时Q便释放其共享锁Q?
A、执行COMMIT或ROLLBACK语句?
B、退出数据库QLOG OFFQ?
C、程序停止运行?
׃n方式表封锁常用于一致性查询过E,卛_查询数据期间表中的数据不发生改变?

2、独占方式表锁
独占方式表封锁是用于锁表中的所有数据,拥有该独占方式表锁的用P卛_以查询该表,又可以更新该表,其它的用户不能再对该表施加Q何封锁(包括׃n、独占或׃n更新锁Q。其它用戯然不能更新该表,但可以查询该表?
独占方式的表锁可通过如下的SQL语句来显C地获得Q?
LOCK TABLE <表名>[,<表名>]....
IN EXCLUSIVE MODE [NOWAIT]
独占方式的表锁也可以在用户执行DML语句INSERT、UPDATE、DELETE旉含获得?
拥有独占方式表封锁的事务Q在出现如下条g之一Ӟ侉K放该锁Q?
Q?Q、执行COMMIT或ROLLBACK语句?
Q?Q、退出数据库QLOG OFFQ?
Q?Q、程序停止运行?
独占方式锁通常用于更新数据Q当某个更新事务涉及多个表时Q可减少发生死锁?

DML锁有如下三种锁方式Q?
Q?Q、共享封锁方式(SHAREQ?
Q?Q、独占封锁方式(EXCLUSIVEQ?
Q?Q、共享更新封锁(SHARE UPDATEQ?
其中SHAREQEXCLUSIVE用于表封锁,SHARE UPDATE用于行封锁?

1、共享方式的表封?
׃n方式的表锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已锁的表q行更更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁Q共享更新锁可以再施加,但不允许持有׃n更新锁的进E做更新。共享该表的所有用户只能查询表中的数据Q但不能更新。共享方式的表封锁只能由用户用SQL语句来设|,句格式如下:
[quote:04b72348bd]LOCK TABLE <表名>[,<表名>]...
IN SHARE MODE [NOWAIT]
[/quote:04b72348bd]
执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择NOWAITQ若该封锁暂时不能施加成功,则返回ƈq户决定是q行{待Q还是先L行别的语句?
持有׃n锁的事务Q在出现如下之一的条件时Q便释放其共享锁Q?
A、执行COMMIT或ROLLBACK语句?
B、退出数据库QLOG OFFQ?
C、程序停止运行?
׃n方式表封锁常用于一致性查询过E,卛_查询数据期间表中的数据不发生改变?BR>
2、独占方式表锁
独占方式表封锁是用于锁表中的所有数据,拥有该独占方式表锁的用P卛_以查询该表,又可以更新该表,其它的用户不能再对该表施加Q何封锁(包括׃n、独占或׃n更新锁Q。其它用戯然不能更新该表,但可以查询该表?
独占方式的表锁可通过如下的SQL语句来显C地获得Q?
LOCK TABLE <表名>[,<表名>]....
IN EXCLUSIVE MODE [NOWAIT]
独占方式的表锁也可以在用户执行DML语句INSERT、UPDATE、DELETE旉含获得?
拥有独占方式表封锁的事务Q在出现如下条g之一Ӟ侉K放该锁Q?<BR>Q?Q、执行COMMIT或ROLLBACK语句?
Q?Q、退出数据库QLOG OFFQ?
Q?Q、程序停止运行?
独占方式锁通常用于更新数据Q当某个更新事务涉及多个表时Q可减少发生死锁?

3、共享更新封锁方?
׃n更新锁是对一个表的一行或多行q行锁Q因而也UC行񔞮锁。表U封锁虽然保证了数据的一致性,但却减弱了操作数据的q行性。行U封锁确保在用户取得被更新的行到该行q行更新q段旉内不被其它用h修改。因而行U锁卛_保证数据的一致性又能提高数据操作的q发性?
可通过如下的两U方式来获得行񔞮锁Q?
Q?Q、执行如下的SQL锁语句Q以昄的方式获得:
LOCK TABLE <表名>[,<表名>]....
IN SHARE UPDATE MODE [NOWAIT]
Q?Q、用如下的SELECT ...FOR UPDATE语句获得Q?
SELECT <列名>[,<列名>]...
FROM <表名>
WHERE <条g>
FOR UPDATE OF <列名>[,<列名>].....[NOWAIT]
一旦用户对某个行施加了行񔞮锁Q则该用户可以查询也可以更新被封锁的数据行,其它用户只能查询但不能更新被锁的数据行Q如果其它用h更新该表中的数据行,则也必须对该表施加行U锁Q即使多个用户对一个表均用了׃n更新Q但也不允许两个事务同时对一个表q行更新Q真正对表进行更新时Q是以独占方式封锁表Q一直到提交或复原该事务为止。行锁永q是独占方式锁?
当出现如下之一的条Ӟ侉K攑օ享更新锁Q?
Q1Q、执行提交(COMMITQ语句;
Q2Q、退出数据库QLOG OFFQ?
Q3Q、程序停止运行?
执行ROLLBACK操作不能释放行锁?
从上面讲q可见,ORACLE RDBMS的加锁机Ӟ解决了ƈ发事务的相容与互斥问题。相容保证事务的q发性,互斥保数据的一致性。不同用户锁的相容与互斥关系׃囄出?

其中最后一行最后一列ؓ其它用户提供在不同行上设|SHARE UPDATE锁。但当用P在某行上q行更新操作Ӟ用户Q只有等待用P提交事务后,才能更新自己所锁的行?BR>
中最后一行最后一列ؓ其它用户提供在不同行上设|SHARE UPDATE锁。但当用P在某行上q行更新操作Ӟ用户Q只有等待用P提交事务后,才能更新自己所锁的行?BR>死锁

锁虽然能够有效的解军_ƈ发操作,但是M资源的独占都会有死锁的危险。例如:有两个事务T1QT2QT1Ҏ据A施加独占锁QT2Ҏ据B施加了独占封锁。再假设T1要对数据B加锁Q由于B已被T2独占锁Q因此T1|于{待状态,{待B被释放;现在若T2也要对Aq行锁Q由于A已被T1独占锁Q因此T2也被|于{待状态。这样就形成了两个事务相互等待的状态,而且永远不能l束Q此U情늧为死锁?
在Oraclepȝ中能自动发现死锁Qƈ选择代h最的Q即完成工作量最的事务予以撤消Q释放该事务所拥有的全部锁Q记其它的事务l工作下厅R?
从系l性能上考虑Q应该尽可能减少资源竞争Q增大吞吐量Q因此用户在lƈ发操作加锁时Q应注意以下几点Q?
Q、对于UPDATE和DELETE操作Q应只封锁要做改动的行,在完成修改后立即提交?
Q、当多个事务正利用共享更新的方式q行更新Q则不要使用׃n锁Q而应采用׃n更新锁Q这样其它用户就能用行U锁Q以增加q行性?
Q、尽可能对一个表的操作的q发事务施加׃n更新锁,从而可提高q行性?
Q、在应用负荷较高的期_不宜对基数据l构Q表、烦引、簇和视图)q行修改

freshboy 2005-08-24 18:04 发表评论
]]>
Struts标签学习http://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10919.htmlfreshboyfreshboyWed, 24 Aug 2005 07:12:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10919.htmlhttp://www.aygfsteel.com/lgcpeter/comments/10919.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/24/10919.html#Feedback0http://www.aygfsteel.com/lgcpeter/comments/commentRss/10919.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/10919.htmlStruts 自带的标{主要有以下几类Q?BR>  1?lt;html:***** >   html,base,link,rewrite,img,checkbox,multibox,radio,form,text,hidden,submit,cancle,reset,erros,select
                                  option,options,optionsCollection,file
  2?lt;logic:*****>    equal,notEqual,lessEqual,greaterEqual,greaterThan,lessThan
  3?lt;bean:****  >   define,write,size,resourse,struts,header,parameter,cookie,page
  4?lt;nested:****>   nest,select,text,writeNesting
  5?lt;tiles:******>   insert

最ȝ的是必须了解每一个标{属性,只能照着例子试!
最多的属性有Qname,value,propertyq三个家伙很ҎhQ必L旉试ȝ才行Q?BR> 有哪位搞得很清楚了请替我补充Q?/P>

freshboy 2005-08-24 15:12 发表评论
]]>
Hello PL/SQL!http://www.aygfsteel.com/lgcpeter/archive/2005/08/23/10798.htmlfreshboyfreshboyTue, 23 Aug 2005 07:16:00 GMThttp://www.aygfsteel.com/lgcpeter/archive/2005/08/23/10798.htmlhttp://www.aygfsteel.com/lgcpeter/comments/10798.htmlhttp://www.aygfsteel.com/lgcpeter/archive/2005/08/23/10798.html#Feedback0http://www.aygfsteel.com/lgcpeter/comments/commentRss/10798.htmlhttp://www.aygfsteel.com/lgcpeter/services/trackbacks/10798.htmlSET SERVEROUTPUT ON
>1 DECLARE
>2 msg VARCHAR2(20);
>3 BEGIN
>4 msg := 'Hello PL/SQL!';
>5 DBMS_OUTPUT.PUT_LINE(msg);
>6 END;
>7 /

q是W一个PL/SQLE序Q它是一个Anonymous blocksQ?BR>另外q有两种形式的程序: Procedures && FunctionsQ?BR>***************Procedures**************
/* q程hello */
>1 CREATE PROCEDURE hello( )
>2 IS 
>3     msg VARCHAR2(20) := message_for_hello;
>4 BEGIN
>5     DBMS_OUTPUT.PUT_LINE(msg);
>6 END;
>7 /
***************************************
*************Functions******************
/* 函数message_for_hello */
>1 CREATE FUNCTION message_for_hello
>2 RETURN VARCHAR2
>3 AS
>4 BEGIN
>5     RETURN 'Hello PL/SQL!';
>6 END;
>7 /
***************************************
通过q程hello调用函数message_for_hello完成?Hello PL/SQL'Q?BR>q可以通过触发器来完成Q触发器主要?BR>   1) 三个语句(INSERT/UPDATE/DELETE);
   2) 二种cd(之前/之后);
   3) 二种U别(row-level/statement-level);
**************Trigger*******************
 >1  CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER 
 >2  INSERT OR DELETE OR UPDATE ON   students
 >3  DECLARE
 >4     msg VARCHAR2(20) := message_for_hello;
 >5  BEGIN
 >6  DBMS_OUTPUT.PUT_LINE(msg);
 >7  END;
****************************************
后箋q得学习基本的控制语句,控制程Q还有包Q异常等Q?BR>待箋、、、、、、、、?BR>      
                                 



freshboy 2005-08-23 15:16 发表评论
]]>
վ֩ģ壺 | | | | | | | | ij| | ƽ| Դ| | ͷ| ɽ| | ˮ| | | ƽ| | | | ƽ| | | ޻| | | Ͻ| | ɽ| | | | | | ̩| | | |