建国's profile小白的生活PhotosBlogLists Tools Help

Blog


    July 24

    Eclipse基金会JSR-220ORM项目介绍:

     

    The JSR220-ORM project provides Eclipse tooling for implementations of the JSR 220 (EJB 3) persistence and JSR 243 (JDO 2) specifications. This project will track the changes to these specifications, so that as they merge together towards a common persistence standard, appropriate tooling will be fully implemented by this project. The over arching goal of this project is to provide visual development tools that facilitate round trip engineering and to provide an implementation that is extensible to accommodate new types of input and generate artifacts for alternative runtimes. 访问JSR-220ORM项目的主页,下载plug-in和开发手册。 项目主页: http://www.eclipse.org/jsr220orm/

    July 13

    Oracle 11g 新特性详解

    新一代的oracle又将增加很多激动人心的新特性。下面介绍一些 Oracle11g的新特性。
    1.数据库管理部分

    ·数据库重演(Database Replay)

    这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测试系统调优后的效果。

    ·SQL重演(SQL Replay)

    和前一特性类似。但是只是捕捉SQL负载部分,而不是全部负载。

    ·计划管理(Plan Management)

    这一特性允许你将某一特定语句的查询计划固定下来,无论统计数据变化还是数据库版本变化都不会改变她的查询计划。

    ·自动诊断知识库(Automatic Diagnostic Repository ADR)

    当Oracle探测到重要错误时,会自动创纪一个事件(incident),并且捕捉到和这一事件相关的信息,同时自动进行数据库健康检查并通知DBA。此外,这些信息还可以打包发送给Oracle支持团队。

    ·事件打包服务(Incident Packaging Service)

    如果你需要进一步测试或者保留相关信息,这一特性可以将与某一事件相关的信息打包。并且你还可以将打包信息发给oracle支持团队。

    ·基于特性打补丁(Feature Based Patching)

    在打补丁包时,这一特性可以使你很容易区分出补丁包中的那些特性是你正在使用而必须打的。企业管理器(EM)使你能订阅一个基于特性的补丁服务,因此企业管理器可以自动扫描那些你正在使用的特性有补丁可以打。

    ·自动SQL优化(Auto SQL Tuning)

    10g的自动优化建议器可以将优化建议写在SQL profile中。而在11g中,你可以让oracle自动将能3倍于原有性能的profile应用到SQL语句上。性能比较由维护窗口中一个新管理任务来完成。

    ·访问建议器(Access Advisor)

    11g的访问建议器可以给出分区建议,包括对新的间隔分区(interval partitioning)的建议。间隔分区相当于范围分区(range partitioning)的自动化版本,她可以在必要时自动创建一个相同大小的分区。范围分区和间隔分区可以同时存在于一张表中,并且范围分区可以转换为间隔分区。

      ·自动内存优化(Auto Memory Tuning)

      在9i中,引入了自动PGA优化; 10g中,又引入了自动SGA优化。到了11g,所有内存可以通过只设定一个参数来实现全表自动优化。你只要告诉oracle有多少内存可用,她就可以自动指定多少内存分配给PGA、多少内存分配给SGA和多少内存分配给操作系统进程。当然也可以设定最大、最小阈值。

      ·资源管理器(Resource Manager)

      11g的资源管理器不仅可以管理CPU,还可以管理IO。你可以设置特定文件的优先级、文件类型和ASM磁盘组。

      ·ADDM

      ADDM在10g被引入。11g中,ADDM不仅可以给单个实例建议,还可以对整个RAC(即数据库级别)给出建议。另外,还可以将一些指示(directive)加入ADDM,使之忽略一些你不关心的信息。

      ·AWR 基线(AWR Baselines)

    AWR基线得到了扩展。可以为一些其他使用到的特性自动创建基线。默认会创建周基线。

    2. PLSQL部分

      ·结果集缓存(Result Set Caching)

      这一特性能大大提高很多程序的性能。在一些MIS系统或者OLAP系统中,需要使用到很多"select count(*)"这样的查询。在之前,我们如果要提高这样的查询的性能,可能需要使用物化视图或者查询重写的技术。在11g,我们就只需要加一个/*+ result_cache*/的提示就可以将结果集缓存住,这样就能大大提高查询性能。当然,在这种情况下,我们可能还要关心另外一个问题:完整性。因为在oracle中是通过一致性读来保证数据的完整性的。而显然,在这种新特性下,为提高性能,是从缓存中的结果集中读取数据,而不会从回滚段中读取数据的。关于这个问题,答案是完全能保证完整性。因为结果集是被独立缓存的,在查询期间,任何其他DML语句都不会影响结果集中的内容,因而可以保证数据的完整性。

      ·对象依赖性改进

      在11g之前,如果有函数或者视图依赖于某张表,一旦这张表发生结构变化,无论是否涉及到函数或视图所依赖的属性,都会使函数或视图变为invalid。在11g中,对这种情况进行了调整:如果表改变的属性与相关的函数或视图无关,则相关对象状态不会发生变化。

      ·正则表达式的改进

      在10g中,引入了正则表达式。这一特性大大方便了开发人员。11g,oracle再次对这一特性进行了改进。其中,增加了一个名为regexp_count的函数。另外,其他的正则表达式函数也得到了改进。

      ·新SQL语法 =>

      我们在调用某一函数时,可以通过=>来为特定的函数参数指定数据。而在11g中,这一语法也同样可以出现在sql语句中了。例如,你可以写这样的语句:
    select f(x=>6) from dual;

      ·对TCP包(utl_tcp、utl_smtp…)支持FGAC(Fine Grained Access Control)安全控制

      ·增加了只读表(read-only table)

      在以前,我们是通过触发器或者约束来实现对表的只读控制。11g中不需要这么麻烦了,可以直接指定表为只读表。

      ·触发器执行效率提高了

      ·内部单元内联(Intra-Unit inlining)

    在C语言中,你可以通过内联函数(inline)或者宏实现使某些小的、被频繁调用的函数内联,编译后,调用内联函数的部分会编译成内联函数的函数体,因而提高函数效率。在11g的plsql中,也同样可以实现这样的内联函数了。

      ·设置触发器顺序

      可能在一张表上存在多个触发器。在11g中,你可以指定它们的触发顺序,而不必担心顺序混乱导致数据混乱。

      ·混合触发器(compound trigger)

      这是11g中新出现的一种触发器。她可以让你在同一触发器中同时具有申明部分、before过程部分、after each row过程部分和after过程部分。

      ·创建无效触发器(Disabled Trigger)

    11g中,开发人员可以可以闲创建一个invalid触发器,需要时再编译她。

      ·在非DML语句中使用序列(sequence)

      在之前版本,如果要将sequence的值赋给变量,需要通过类似以下语句实现:
    select seq_x.next_val into v_x from dual;
    在11g中,不需要这么麻烦了,下面语句就可以实现:
    v_x := seq_x.next_val;

      ·PLSQL_Warning

      11g中。可以通过设置PLSQL_Warning=enable all,如果在"when others"没有错误爆出就发警告信息。

      ·PLSQL的可继承性

    可以在oracle对象类型中通过super(和java中类似)关键字来实现继承性。

      ·编译速度提高

      因为不在使用外部C编译器了,因此编译速度提高了。

      ·改进了DBMS_SQL包

      其中的改进之一就是DBMS_SQL可以接收大于32k的CLOB了。另外还能支持用户自定义类型和bulk操作。

      ·增加了continue关键字

    在PLSQL的循环语句中可以使用continue关键字了(功能和其他高级语言中的continue关键字相同)。

      ·新的PLSQL数据类型——simple_integer

      这是一个比pls_integer效率更高的整数数据类型。

    3. 其他部分

      ·增强的压缩技术

      可以最多压缩2/3的空间。

      ·高速推进技术

      可以大大提高对文件系统的数据读取速度。

      ·增强了DATA Guard

      可以创建standby数据库的快照,用于测试。结合数据库重演技术,可以实现模拟生成系统负载的压力测试

      ·在线应用升级

      也就是热补丁——安装升级或打补丁不需要重启数据库

      ·数据库修复建议器

      可以在错误诊断和解决方案实施过程中指导DBA。

      ·逻辑对象分区

      可以对逻辑对象进行分区,并且可以自动创建分区以方便管理超大数据库(Very Large Databases VLDBs)

      ·新的高性能的LOB基础结构

      ·新的PHP驱动

    July 08

    老婆真牛,一口气写了3000行的SQL查询

    select stage,boh,wip,move,target,rwip,qwip,hwip,bmw,main,amw,cwip,cmove, ct,p1,engwip,cengwip,bwip,
    keystage,nvl(wolinenow,0)wolinenow,nvl(wolinenext,0)wolinenext,stageorder,area
    from (
      SELECT aa.stageorder,aa.stage,nvl(boh,0) boh,wip,rwip,qwip,hwip, 
      ahand BMW,main,below AMW,move,cmove,nvl(round(ee.ct,2),0) ct ,p1,cwip,engwip,cengwip,bwip,
      target keystage,wolinenow,wolinenext,nvl(dd.target,0) target,aa.area
      FROM(SELECT  /*+use_hash(a b)*/ b.stageorder,b.stage,b.area,
           NVL(SUM(DECODE(a.bank,'',a.componentqty,0)),0) wip, 
           SUM(DECODE(a.adstatus,'Running',a.componentqty,0)) rwip, 
           SUM(DECODE(a.adstatus,'Waiting',a.componentqty,0)) qwip, 
           SUM(DECODE(a.adstatus,'Holding',a.componentqty,0)) hwip,
           nvl(SUM(DECODE(a.bank, null ,0,a.componentqty)),0) bwip,  
           nvl(ahand,0) ahand , nvl(main,0) main, nvl(below,0) below ,
           NVL(SUM(SUM(DECODE(a.bank,'',a.componentqty,0))) 
    			   	over(ORDER BY b.stageorder DESC),0) cwip, 
           SUM(CASE WHEN a.priority=1 AND a.bank IS NULL THEN a.componentqty ELSE 0 END) P1,
           nvl(engwip,0) engwip,	   
           nvl(sum(engwip) over (ORDER BY b.stageORDER DESC),0)  cengwip,wolinenow,wolinenext  
           FROM (SELECT priority,bank,componentqty,adstatus,b.stage 
                 FROM SDB_TB_INFO_WIP  a, 
                      (select stage,location from sdb_tb_info_stage) b,
                (SELECT keytype section,keyvalue area 
                 FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c
                 WHERE SUBSTR(lottype,1,1) IN ('E','L','T','P','R','M','B','X')
                 and a.stage=b.stage
                 AND b.location=c.area
                 and c.section LIKE :section
                 and technology like :technology
                 and b.location like :area
                 and priority like :priority
                 and priority <=:priorityf
                 and SUBSTR(lottype,1,1)  not in :lottypel
                 and lottype not in :lottypet) a,
                (select stageorder,stage,AREA
                 from (SELECT b1.stageorder,b1.stage,B2.LOCATION AREA
                       FROM SDB_TB_INFO_STAGE  b1,
                           (select stage,location from SDB_TB_INFO_STAGE  
                            where location like :area
                            and stagegroup ='ALL') b2,
                (SELECT keytype section,keyvalue area 
                 FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')b3
                       WHERE b1.stagegroup =:tech 
                       and b1.stage=b2.stage 			  
                       AND b2.location=b3.area
                       and b3.section LIKE :section             
                       UNION ALL 
                       SELECT UNIQUE stageorder,stage,AREA 
                       FROM(SELECT UNIQUE b.stageorder,a.stage,B.LOCATION AREA
                            FROM SDB_TB_INFO_WIP  a,  
                                (select * from sdb_tb_info_stage where stagegroup ='ALL') b,
                            (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c	                   
                            WHERE lottype NOT IN ('C','V','D','Z','Y') 
                            and a.stage=b.stage       
                            AND b.location=c.area
                            and c.section LIKE :section
                            and technology like :technology
                            and B.location like :area
                            and priority like :priority
                            and priority <=:priorityf
                            and SUBSTR(lottype,1,1)  not in :lottypel
                            and lottype not in :lottypet
                            UNION 
                            SELECT UNIQUE b.stageorder,a.stage,B.LOCATION AREA
                            FROM SDB_TB_MOVE_WIP  a,
                                (select * from sdb_tb_info_stage where stagegroup ='ALL') b,
                            (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c    
                            WHERE SUBSTR(lottype,1,1) IN ('E','L','T','P','R','M','B','X')
                            and a.stage=b.stage			
                            AND b.location=c.area
                            and c.section LIKE :section	  
                            and technology like :technology
                            and priority like :priority
                            and b.location like :area 
                            and priority <=:priorityf
                            and SUBSTR(lottype,1,1)  not in :lottypel
                            and lottype not in :lottypet) 
                       WHERE stage NOT IN (SELECT b1.stage 
                                           FROM SDB_TB_INFO_STAGE  b1,
                                                (select stage,location from SDB_TB_INFO_STAGE  
                                                 where location like :area
                                                 and stagegroup ='ALL') b2,
                                          (SELECT keytype section,keyvalue area 
                                           FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')b3
                                           WHERE b1.stagegroup =:tech 
                                           AND b2.location=b3.area
                                           and b3.section LIKE :section
                                           and b1.stage=b2.stage))
                 where stage in (select stage from sdb_tb_stg_mfgarea
                                 where processtype like :processtype))b,
                (select unique stage,
                 sum(case when stepno=stepnomain then componentqty else 0 end) main,
                 sum(case when stepno>stepnomain then componentqty else 0 end) Ahand,
                 sum(case when stepno<stepnomain then componentqty else 0 end) Below
                 from (select unique lotid, b.stepno,b.componentqty,b.stage,a.stepno stepnomain,flag   
                       from (select * from sdb_tb_mfg_main_step where flag ='M') a,
                            (select * from sdb_tb_info_wip  
                             where lottype not in ('V','C','D','Z','Y')
                             and bank is null
                             and priority like :priority
                             and priority <=:priorityf
                             and SUBSTR(lottype,1,1)  not in :lottypel
                             and lottype not in :lottypet
                             and substr(planname,2,5) like :technology
                             and location like :area) b,
                    (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c	                        
                       where a.process =b.planname     	
                       AND b.location=c.area
                       and c.section LIKE :section	
                       and a.stage=b.stage)
                 group by stage) c,
                (select unique b.stage,sum(componentqty) engwip 
                 from sdb_tb_info_wip  a,
                      (select stage,location from sdb_tb_info_stage where stagegroup ='ALL') b,
                      (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c  
                 where lottype in ('L','T')
                 AND b.location=c.area
                 and c.section LIKE :section
                 and bank is null
                 and technology like :technology
                 and b.location like :area
                 and a.stage=b.stage
                 and priority like :priority
                 and priority <=:priorityf
                 group by b.stage)d,
                (SELECT Max(wolinenow) wolinenow 
                 FROM (SELECT WOLINE wolinenow FROM sdb_tb_mfg_woline
                       WHERE period='CMPL'
                       AND productname IN('ALL','NA')
                       AND tech LIKE :tech
                       UNION ALL
                       SELECT '' FROM dual))e,
                (SELECT Max(wolinenext) wolinenext 
                 FROM (SELECT WOLINE wolinenext FROM sdb_tb_mfg_woline
                       WHERE period='N1MPL'
                       AND productname IN('ALL','NA')
                       AND tech LIKE :tech
                       UNION ALL
                       SELECT '' FROM dual))f			            									 							   
           WHERE a.stage(+)=b.stage 
           and b.stage=d.stage(+)
           and b.stage =c.stage(+)
           GROUP BY b.stageorder,b.stage,b.area,ahand , main, below,engwip,wolinenow,wolinenext 
           ORDER BY stageorder) aa, 
          (SELECT /*+use_hash(a b)+*/b.stage,b.stageorder,NVL(SUM(a.componentqty),0) move,
    	     NVL(sum(SUM(a.componentqty)) 
    			  	over(ORDER BY b.stageorder DESC),0) cmove
           FROM (SELECT a.* FROM SDB_TB_MOVE_WIP  a,sdb_tb_info_stage  b,
           (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c
                 WHERE SUBSTR(lottype,1,1) IN ('E','L','T','P','R','M','B','X')
                 and b.stagegroup='ALL'
                 and a.stage =b.stage(+)
                 AND b.location=c.area
                 and c.section LIKE :section
                 and technology like :technology
                 and b.location like :area
                 and priority like :priority
                 and priority <=:priorityf
                 and SUBSTR(lottype,1,1)  not in :lottypel
                 and lottype not in :lottypet) a, 
                (select stageorder,stage 
                 from (SELECT b1.stageorder,b1.stage 
                       FROM SDB_TB_INFO_STAGE  b1,
                           (select stage,location from SDB_TB_INFO_STAGE  
                            where location like :area
                            and stagegroup ='ALL') b2 ,
                      (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')b3
                       WHERE b1.stagegroup =:tech 
                       AND b2.location=b3.area
                       and b3.section LIKE :section
                       and b1.stage=b2.stage 			               
                       UNION ALL 
                       SELECT UNIQUE stageorder,stage 
                       FROM(SELECT UNIQUE b.stageorder,a.stage
                            FROM SDB_TB_INFO_WIP  a,  
                                (select * from sdb_tb_info_stage where stagegroup ='ALL') b,
                            (SELECT keytype section,keyvalue area 
                             FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c	                   
                            WHERE lottype NOT IN ('C','V','D','Z','Y') 
                            and a.stage=b.stage
                            AND b.location=c.area
                            and c.section LIKE :section
                            and technology like :technology
                            and B.location like :area
                            and priority like :priority
                            and priority <=:priorityf
                            and SUBSTR(lottype,1,1)  not in :lottypel
                            and lottype not in :lottypet
                            UNION 
                            SELECT UNIQUE b.stageorder,a.stage
                            FROM SDB_TB_MOVE_WIP  a,
                                (select * from sdb_tb_info_stage where stagegroup ='ALL') b,
                                (SELECT keytype section,keyvalue area 
                                 FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c	    
                            WHERE SUBSTR(lottype,1,1) IN ('E','L','T','P','R','M','B','X')
                            and a.stage=b.stage				  
                            AND b.location=c.area
                            and c.section LIKE :section
                            and technology like :technology
                            and priority like :priority
                            and b.location like :area 
                            and priority <=:priorityf
                            and SUBSTR(lottype,1,1)  not in :lottypel
                            and lottype not in :lottypet) 
                       WHERE stage NOT IN (SELECT b1.stage 
                                           FROM SDB_TB_INFO_STAGE  b1,
                                                (select stage,location from SDB_TB_INFO_STAGE  
                                                 where location like :area
                                                 and stagegroup ='ALL') b2,
                                                 (SELECT keytype section,keyvalue area 
                                 FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')b3
                                           WHERE b1.stagegroup =:tech 
                                           AND b2.location=b3.area
                                           and b3.section LIKE :section
                                           and b1.stage=b2.stage))
                 where stage in (select stage from sdb_tb_stg_mfgarea
                                 where processtype like :processtype)) b								 
           WHERE b.stage = a.stage(+) 
           GROUP BY b.stage,b.stageorder
           ORDER BY stageorder ) bb,
          (SELECT b.stageorder,b.stage,b.location, 
           NVL(SUM(DECODE(bank,'',a.componentqty,0)),0) boh
           FROM (SELECT priority,bank,componentqty,adstatus,b.stage 
                 FROM SDB_TB_INFO_WIP_hist  a, 
                      (select stage,location from sdb_tb_info_stage) b,
                      (SELECT keytype section,keyvalue area 
                       FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c
                WHERE SUBSTR(lottype,1,1) IN ('E','L','T','P','R','M','B','X')
                and technology like :technology
                and b.location like :area
                and a.stage=b.stage
                AND b.location=c.area
                and c.section LIKE :section
                and priority like :priority
                and priority <=:priorityf
                and SUBSTR(lottype,1,1)  not in :lottypel
                and lottype not in :lottypet) a, 
               (SELECT stageorder,stage,location FROM SDB_TB_INFO_STAGE  
                WHERE stagegroup=:tech)b 
           WHERE a.stage(+)=b.stage 
           GROUP BY b.stageorder,b.stage,b.location ORDER BY stageorder) cc,
          (select unique stage,sum(target) target from sdb_tb_mfg_target
           where activity ='MoveByTechStage'
           and tech like :technology
           group by stage) dd,
          (select stage,avg(ct) ct from sdb_tb_mfg_ct b,
          (SELECT keytype section,keyvalue area 
                       FROM SDB_TB_REPORT_CONFIG WHERE LINKNAME='SECTION_LOCATION')c
           where tech like :technology
           AND b.location=c.area
           and c.section LIKE :section
           and location like :area
           group by stage)ee  
     WHERE aa.stageorder=bb.stageorder 
     AND aa.stage=bb.stage
     and aa.stage=dd.stage(+)
     and aa.stage=ee.stage(+)
     and aa.stageorder =cc.stageorder(+)
     and aa.stage=cc.stage(+)
     order by stageorder) 
    where to_char(target) !=:target
    
    ....还有...
    July 03

    理解REST软件架构

    一种思维方式影响了软件行业的发展。REST软件架构是当今世界上最成功的互联网的超媒体分布式系统。它让人们真正理解我们的网络协议HTTP本来面貌。它正在成为网络服务的主流技术,同时也正在改变互联网的网络软件开发的全新思维方式。AJAX技术和Rails框架把REST软件架构思想真正地在实际中很好表现出来。今天微软也已经应用REST并且提出把我们现有的网络变成为一个语义网,这种网络将会使得搜索更加智能化。

    REST与HTTP协议

    REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的。他为我们描绘了开发基于互联网的网络软件的蓝图。REST软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是HTTP协议。通常我们把REST也写作为REST/HTTP,在实际中往往把REST理解为基于HTTP的REST软件架构,或者更进一步把REST和HTTP看作为等同的概念。

    今天,HTTP是互联网上应用最广泛的计算机协议。HTTP不是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。它不仅仅能够对于互联网资源进行唯一定位,而且还能告诉我们对于该资源进行怎样运作。这也是REST软件架构当中最重要的两个理念。而REST软件架构理念是真正理解HTTP协议而形成的。有了REST软件架构理念出现,才使得软件业避免了对HTTP协议的片面理解。只有正确的理论指导,才能避免在软件开发的实际工作过程中少走弯路。

    REST与URI(资源定位)

    REST软件架构之所以是一个超媒体系统,是因为它可以把网络上所有资源进行唯一的定位,不管你的文件是图片、文件Word还是视频文件,也不管你的文件是txt文件格式、xml文件格式还是其它文本文件格式。它利用支持HTTP的TCP/IP协议来确定互联网上的资源。

    REST与CRUD原则

    REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭),所以有时候CRUD也写作为 RUDI,其中的I就是insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

    REST与网络服务

    尽管在Java语言世界中网络服务目前是以SOAP技术为主,但是REST将是是网络服务的另一选择,并且是真正意义上的网络服务。基于REST思想的网络服务不久的将来也会成为是网络服务的主流技术。REST不仅仅把HTTP作为自己的数据运输协议,而且也作为直接进行数据处理的工具。而当前的网络服务技术都需要使用其它手段来完成数据处理工作,它们完全独立于HTTP协议来进行的,这样增加了大量的复杂软件架构设计工作。REST的思想充分利用了现有的HTTP技术的网络能力。在德国电视台上曾经出现过一个这样的五十万欧元智力题:如何实现网络服务才能充分利用现有的HTTP协议?该问题给出了四个答案:去问微软;WSDL2.0/SOAP1.2;WS-Transfer;根本没有。这个问题告诉我们HTTP并不是一个简单的数据传来传去的协议,而是一个聪明的会表现自己的协议,这也许是REST = Representational State Transfer的真正含义。

    实际上目前很多大公司已经采用了REST技术作为网络服务,如Google、Amazon等。在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是Apache CXF Axis2 。Java语言也制定关于REST网络服务规范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信还会出现更多与REST相关的激动人心的信息。

    REST与AJAX技术

    尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了 HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。

    AJAX技术还使用了一种不同于XML格式的JSON文件格式,这个意义在哪里呢?在REST软件架构下我们不能对于XML文件进行序列化处理,这样程序员必须要使用自己的XML绑定框架。而以序列化的JavaScript对象为基础的JSON已经获得了广泛认可,它被认为能以远比XML更好的方式来序列化和传输简单数据结构,而且它更简洁。这对REST是一个极大贡献和补充。

    当前的网络应用软件还违背了REST的“无状态服务器”约束。REST服务器只知道自己的状态。REST不关心客户端的状态,客户端的状态自己来管理,这是AJAX技术的应用之地。通过AJAX技术,可以发挥有状态网络客户机的优势。而REST的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。

    REST与Rails框架

    Ruby on Rails框架(简称Rails或者Rails框架)是一个基于Ruby语言的越来越流行的网络应用软件开发框架。它提供了关于REST最好的支持,也是当今应用REST最成功的一个软件开发框架。Rails框架(从版本1.2.x起)成为了第一个引入REST作为核心思想的主流网络软件开发框架。在 Rails框架的充分利用了REST软件架构之后,人们更加坚信REST的重要性和必要性。Rails利用REST软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待REST,它是网络服务最理想的手段,但是Rails框架把REST带到了网络应用软件开发框架。这是一次飞跃,让REST的思想从网络服务的应用提升到了网络应用软件开发。利用REST思想的simply_restful插件已经成为了Rails框架的核心内容。

    REST安全性

    我们把现有基于SOAP的网络服务和基于REST/HTTP网络服务作个比喻,前者是一种传统的寄信方式,而后者是现代网络的电子邮件方式。要是是寄信和电子邮件都有病毒存在的话,传统的寄信被送到对方就很危险,而电子邮件是开发的,电子邮件供应商比如Google为我们检查了电子邮件是否有病毒。这里并不是说明SOAP网络服务消息包含义病毒,而是说明HTTP是无法处理SOAP信息包究竟好不好,需要额外的软件工具解决这一问题,包括防火墙也用不上和管不了。

    REST/HTTP网络服务的信息包可以被防火墙理解和控制。你可以按照操作和链接进行过滤信息包,如你可以规定从外部来的只能读取(GET操作)自己服务器的资源。这样对于系统管理员而言使得软件管理更为简单。REST的安全性还可以利用传输安全协议SSL/TLS、基本和摘要式认证(Basic und Digest Authentication)。除了这些REST自身的安全性功能外,还可以利用像基于信息的Web Services Security(JSR 155)作为REST不错的补充