隨筆:-4 文章:58 評(píng)論:4 引用:0
          首頁(yè) 發(fā)新隨筆
          發(fā)新文章 聯(lián)系 聚合管理

          2009年6月2日

          volatile:
                Java語(yǔ)言規(guī)范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當(dāng)線程進(jìn)入或者離開(kāi)同步代碼塊時(shí)才與共享成員變量的原始值對(duì)比。 這樣當(dāng)多個(gè)線程同時(shí)與某個(gè)對(duì)象交互時(shí),就必須要注意到要讓線程及時(shí)的得到共享成員變量的變化。 而volatile關(guān)鍵字就是提示VM:對(duì)于這個(gè)成員變量不能保存它的私有拷貝,而應(yīng)直接與共享成員變量交互。 使用建議:在兩個(gè)或者更多的線程訪問(wèn)的成員變量上使用volatile。當(dāng)要訪問(wèn)的變量已在synchronized代碼塊中,或者為常量時(shí),不必使用。     由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時(shí)才使用此關(guān)鍵字。
          Synchronized:
          防止多個(gè)線程同時(shí)訪問(wèn)相同的代碼段。
          Transient:
          表明類序列化時(shí),變量不必序列化。
          posted @ 2010-04-09 13:47 久久不醉 閱讀(132) | 評(píng)論 (0)編輯 收藏
           

          配置一個(gè)數(shù)據(jù)源
              Spring在第三方依賴包中包含了兩個(gè)數(shù)據(jù)源的實(shí)現(xiàn)類包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用這兩者中任何一個(gè)配置數(shù)據(jù)源。

           DBCP數(shù)據(jù)源
              DBCP類包位于 <spring_home></spring_home>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個(gè)依賴 Jakarta commons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫(kù)連接池,所以在類路徑下還必須包括<spring_home></spring_home>/lib/jakarta- commons/commons-pool.jar。下面是使用DBCP配置MySql數(shù)據(jù)源的配置片斷:

          xml 代碼
          1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
          2.         destroy-method="close">       
          3.     <property name="driverClassName" value="com.mysql.jdbc.Driver" />      
          4.     <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />      
          5.     <property name="username" value="root" />      
          6.     <property name="password" value="1234" />      
          7. </bean>  

          BasicDataSource提供了close()方法關(guān)閉數(shù)據(jù)源,所以必須設(shè)定destroy-method=”close”屬性, 以便Spring容器關(guān)閉時(shí),數(shù)據(jù)源能夠正常關(guān)閉。除以上必須的數(shù)據(jù)源屬性外,還有一些常用的屬性:
              defaultAutoCommit:設(shè)置從數(shù)據(jù)源中返回的連接是否采用自動(dòng)提交機(jī)制,默認(rèn)值為 true;
              defaultReadOnly:設(shè)置數(shù)據(jù)源是否僅能執(zhí)行只讀操作, 默認(rèn)值為 false;
              maxActive:最大連接數(shù)據(jù)庫(kù)連接數(shù),設(shè)置為0時(shí),表示沒(méi)有限制;
              maxIdle:最大等待連接中的數(shù)量,設(shè)置為0時(shí),表示沒(méi)有限制;
              maxWait:最大等待秒數(shù),單位為毫秒, 超過(guò)時(shí)間會(huì)報(bào)出錯(cuò)誤信息;
              validationQuery:用于驗(yàn)證連接是否成功的查詢SQL語(yǔ)句,SQL語(yǔ)句必須至少要返回一行數(shù)據(jù), 如你可以簡(jiǎn)單地設(shè)置為:“select count(*) from user”;
              removeAbandoned:是否自我中斷,默認(rèn)是 false ;
              removeAbandonedTimeout:幾秒后數(shù)據(jù)連接會(huì)自動(dòng)斷開(kāi),在removeAbandoned為true,提供該值;
              logAbandoned:是否記錄中斷事件, 默認(rèn)為 false;

          C3P0數(shù)據(jù)源
              C3P0是一個(gè)開(kāi)放源代碼的JDBC數(shù)據(jù)源實(shí)現(xiàn)項(xiàng)目,它在lib目錄中與Hibernate一起發(fā)布,實(shí)現(xiàn)了JDBC3和JDBC2擴(kuò)展規(guī)范說(shuō)明的 Connection 和Statement 池。C3P0類包位于<spring_home></spring_home>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個(gè) Oracle數(shù)據(jù)源:

          xml 代碼
          1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"       
          2.         destroy-method="close">      
          3.     <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>      
          4.     <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>      
          5.     <property name="user" value="admin"/>      
          6.     <property name="password" value="1234"/>      
          7. </bean>  

          ComboPooledDataSource和BasicDataSource一樣提供了一個(gè)用于關(guān)閉數(shù)據(jù)源的close()方法,這樣我們就可以保證Spring容器關(guān)閉時(shí)數(shù)據(jù)源能夠成功釋放。
              C3P0擁有比DBCP更豐富的配置屬性,通過(guò)這些屬性,可以對(duì)數(shù)據(jù)源進(jìn)行各種有效的控制:
              acquireIncrement:當(dāng)連接池中的連接用完時(shí),C3P0一次性創(chuàng)建新連接的數(shù)目;
              acquireRetryAttempts:定義在從數(shù)據(jù)庫(kù)獲取新連接失敗后重復(fù)嘗試獲取的次數(shù),默認(rèn)為30;
              acquireRetryDelay:兩次連接中間隔時(shí)間,單位毫秒,默認(rèn)為1000;
              autoCommitOnClose:連接關(guān)閉時(shí)默認(rèn)將所有未提交的操作回滾。默認(rèn)為false;
              automaticTestTable: C3P0將建一張名為T(mén)est的空表,并使用其自帶的查詢語(yǔ)句進(jìn)行測(cè)試。如果定義了這個(gè)參數(shù),那么屬性preferredTestQuery將被忽略。你 不能在這張Test表上進(jìn)行任何操作,它將中為C3P0測(cè)試所用,默認(rèn)為null;
              breakAfterAcquireFailure:獲取連接失敗將會(huì)引起所有等待獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)   用getConnection()的時(shí)候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開(kāi)并永久關(guān)閉。默認(rèn)為 false;
              checkoutTimeout:當(dāng)連接池用完時(shí)客戶端調(diào)用getConnection()后等待獲取新連接的時(shí)間,超時(shí)后將拋出SQLException,如設(shè)為0則無(wú)限期等待。單位毫秒,默認(rèn)為0;
              connectionTesterClassName: 通過(guò)實(shí)現(xiàn)ConnectionTester或QueryConnectionTester的類來(lái)測(cè)試連接,類名需設(shè)置為全限定名。默認(rèn)為 com.mchange.v2.C3P0.impl.DefaultConnectionTester; 
              idleConnectionTestPeriod:隔多少秒檢查所有連接池中的空閑連接,默認(rèn)為0表示不檢查;
              initialPoolSize:初始化時(shí)創(chuàng)建的連接數(shù),應(yīng)在minPoolSize與maxPoolSize之間取值。默認(rèn)為3;
              maxIdleTime:最大空閑時(shí)間,超過(guò)空閑時(shí)間的連接將被丟棄。為0或負(fù)數(shù)則永不丟棄。默認(rèn)為0;
              maxPoolSize:連接池中保留的最大連接數(shù)。默認(rèn)為15;
              maxStatements:JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatement數(shù)量。但由于預(yù)緩存的Statement屬 于單個(gè)Connection而不是整個(gè)連接池。所以設(shè)置這個(gè)參數(shù)需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均為0,則緩存被關(guān)閉。默認(rèn)為0;
              maxStatementsPerConnection:連接池內(nèi)單個(gè)連接所擁有的最大緩存Statement數(shù)。默認(rèn)為0;
              numHelperThreads:C3P0是異步操作的,緩慢的JDBC操作通過(guò)幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能,通過(guò)多線程實(shí)現(xiàn)多個(gè)操作同時(shí)被執(zhí)行。默認(rèn)為3;
              preferredTestQuery:定義所有連接測(cè)試都執(zhí)行的測(cè)試語(yǔ)句。在使用連接測(cè)試的情況下這個(gè)參數(shù)能顯著提高測(cè)試速度。測(cè)試的表必須在初始數(shù)據(jù)源的時(shí)候就存在。默認(rèn)為null;
              propertyCycle: 用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待的秒數(shù)。默認(rèn)為300;
              testConnectionOnCheckout:因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交的時(shí)候都 將校驗(yàn)其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
          等方法來(lái)提升連接測(cè)試的性能。默認(rèn)為false;
              testConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。默認(rèn)為false。

          讀配置文件的方式引用屬性:

          1. <bean id="propertyConfigurer"     
          2.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">      
          3.     <property name="location" value="/WEB-INF/jdbc.properties"/>      
          4. </bean>      
          5. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
          6.         destroy-method="close">      
          7.     <property name="driverClassName" value="${jdbc.driverClassName}" />      
          8.     <property name="url" value="${jdbc.url}" />      
          9.     <property name="username" value="${jdbc.username}" />      
          10.     <property name="password" value="${jdbc.password}" />      
          11. </bean>   

              在jdbc.properties屬性文件中定義屬性值:
              jdbc.driverClassName= com.mysql.jdbc.Driver
              jdbc.url= jdbc:mysql://localhost:3309/sampledb
              jdbc.username=root
              jdbc.password=1234
              提示 經(jīng)常有開(kāi)發(fā)者在${xxx}的前后不小心鍵入一些空格,這些空格字符將和變量合并后作為屬性的值。如: <property name="username" value=" ${jdbc.username} "></property> 的屬性配置項(xiàng),在前后都有空格,被解析后,username的值為“ 1234 ”,這將造成最終的錯(cuò)誤,因此需要特別小心。

           獲取JNDI數(shù)據(jù)源
              如果應(yīng)用配置在高性能的應(yīng)用服務(wù)器(如WebLogic或Websphere等)上,我們可能更希望使用應(yīng)用服務(wù)器本身提供的數(shù)據(jù)源。應(yīng)用服務(wù)器的數(shù)據(jù)源 使用JNDI開(kāi)放調(diào)用者使用,Spring為此專門(mén)提供引用JNDI資源的JndiObjectFactoryBean類。下面是一個(gè)簡(jiǎn)單的配置:

          xml 代碼
          1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">      
          2.     <property name="jndiName" value="java:comp/env/jdbc/bbt"/>      
          3. </bean>  

          通過(guò)jndiName指定引用的JNDI數(shù)據(jù)源名稱。
              Spring 2.0為獲取J2EE資源提供了一個(gè)jee命名空間,通過(guò)jee命名空間,可以有效地簡(jiǎn)化J2EE資源的引用。下面是使用jee命名空間引用JNDI數(shù)據(jù)源的配置:

          xml 代碼
          1. <beans xmlns=http://www.springframework.org/schema/beans    
          2. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance    
          3. xmlns:jee=http://www.springframework.org/schema/jee    
          4. xsi:schemaLocation="http://www.springframework.org/schema/beans     
          5. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     
          6. http://www.springframework.org/schema/jee    
          7. http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">      
          8. <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>      
          9. </beans>  

          Spring的數(shù)據(jù)源實(shí)現(xiàn)類
              Spring本身也提供了一個(gè)簡(jiǎn)單的數(shù)據(jù)源實(shí)現(xiàn)類DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。這個(gè)類實(shí)現(xiàn)了javax.sql.DataSource接口,但 它并沒(méi)有提供池化連接的機(jī)制,每次調(diào)用getConnection()獲取新連接時(shí),只是簡(jiǎn)單地創(chuàng)建一個(gè)新的連接。因此,這個(gè)數(shù)據(jù)源類比較適合在單元測(cè)試 或簡(jiǎn)單的獨(dú)立應(yīng)用中使用,因?yàn)樗恍枰~外的依賴類。
               下面,我們來(lái)看一下DriverManagerDataSource的簡(jiǎn)單使用:
          當(dāng)然,我們也可以通過(guò)配置的方式直接使用DriverManagerDataSource。

          java 代碼
          1. DriverManagerDataSource ds = new DriverManagerDataSource ();      
          2. ds.setDriverClassName("com.mysql.jdbc.Driver");      
          3. ds.setUrl("jdbc:mysql://localhost:3309/sampledb");      
          4. ds.setUsername("root");      
          5. ds.setPassword("1234");      
          6. Connection actualCon = ds.getConnection();  

           

          小結(jié)

              不管采用何種持久化技術(shù),都需要定義數(shù)據(jù)源。Spring附帶了兩個(gè)數(shù)據(jù)源的實(shí)現(xiàn)類包,你可以自行選擇進(jìn)行定義。在實(shí)際部署時(shí),我們可能會(huì)直接采用應(yīng)用服 務(wù)器本身提供的數(shù)據(jù)源,這時(shí),則可以通過(guò)JndiObjectFactoryBean或jee命名空間引用JNDI中的數(shù)據(jù)源。

          DBCP與C3PO配置的區(qū)別:

          C3PO :DBCP:

          xml 代碼
          1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
          2.     <property name="driverClass">  
          3.         <value>oracle.jdbc.driver.OracleDriver</value>  
          4.     </property>  
          5.     <property name="jdbcUrl">             
          6.         <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  
          7.      </property>  
          8.     <property name="user">  
          9.         <value>testAdmin</value>  
          10.     </property>  
          11.     <property name="password">  
          12.         <value>123456</value>  
          13.     </property>  
          14. </bean>  

           

          xml 代碼
          1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
          2.     <property name="driverClassName">  
          3.         <value>oracle.jdbc.driver.OracleDriver</value>  
          4.     </property>  
          5.     <property name="url">             
          6.         <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  
          7.      </property>  
          8.     <property name="username">  
          9.         <value>testAdmin</value>  
          10.     </property>  
          11.     <property name="password">  
          12.         <value>123456</value>  
          13.     </property>  
          14. </bean>  
          posted @ 2010-03-03 14:12 久久不醉 閱讀(200) | 評(píng)論 (0)編輯 收藏
           

          oracle xe universal默認(rèn)創(chuàng)建AL32UTF8字符集,這種字符集1個(gè)漢字占用3個(gè)字節(jié),而
          ZHS16GBK字符集1個(gè)漢字占用2個(gè)字節(jié),為了節(jié)約空間,我嘗試改變數(shù)據(jù)庫(kù)的字符集,
          但是失敗了,因?yàn)樾伦址皇桥f字符集的超集。即使用restrict模式也不行。
          考慮到oracle xe 安裝時(shí)只是建一個(gè)空庫(kù),僅包含系統(tǒng)表空間等,設(shè)想通過(guò)手工執(zhí)行
          創(chuàng)建ZHS16GBK字符集數(shù)據(jù)庫(kù)的辦法實(shí)現(xiàn)。
          從sybex的10g ocp教材中復(fù)制并修改得下面語(yǔ)句,其中E:\ORADATA\TEST是我們要存放
          新數(shù)據(jù)庫(kù)物理文件的目錄,以和舊數(shù)據(jù)庫(kù)區(qū)分。


          CREATE DATABASE XE
          CONTROLFILE REUSE
          LOGFILE
          GROUP 1 'E:\ORADATA\TEST\REDO01.LOG' SIZE 10M,
          GROUP 2 'E:\ORADATA\TEST\REDO02.LOG' SIZE 10M,
          GROUP 3 'E:\ORADATA\TEST\REDO03.LOG' SIZE 10M
          DATAFILE 'E:\ORADATA\TEST\SYSTEM01.DBF' SIZE 400M
          AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
          SYSAUX DATAFILE 'E:\ORADATA\TEST\SYSAUX01.DBF' SIZE 250M
          AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
          DEFAULT TEMPORARY TABLESPACE temp
          TEMPFILE 'E:\ORADATA\TEST\TEMP01.DBF' SIZE 100M
          AUTOEXTEND ON NEXT 100M MAXSIZE 8000M
          UNDO TABLESPACE undo
          DATAFILE 'E:\ORADATA\TEST\undo01.DBF' SIZE 200M
          AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
          CHARACTER SET ZHS16GBK
          NATIONAL CHARACTER SET AL16UTF16
          USER SYS IDENTIFIED BY SYS
          USER SYSTEM IDENTIFIED BY SYS
          ;
          在執(zhí)行這個(gè)腳本以前,有3點(diǎn)要注意:
          1 要修改F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\init.ora'

          F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
          把所有路徑改成E:\ORADATA\TEST及其子目錄,為此我們需要在E:\ORADATA\TEST下建立
          bdump等目錄,這些目錄可以從現(xiàn)有的XE數(shù)據(jù)庫(kù)F:\oraclexe\app\oracle\admin\XE復(fù)制得到。

          2 要去掉EXTENT MANAGEMENT LOCAL語(yǔ)句否則執(zhí)行出錯(cuò)。(沒(méi)有找出原因)

          CREATE DATABASE XE
          *
          第 1 行出現(xiàn)錯(cuò)誤:
          ORA-25146: EXTENT MANAGEMENT ?????

          3 test.ora中的db_name不能改變,否則執(zhí)行出錯(cuò)。(沒(méi)有找出原因)
          ORA-02778: Name given for the log directory is invalid

          具體執(zhí)行步驟(以Windows XP為例)
          1在cmd命令行窗口執(zhí)行 net start oracleservicexe
          C:\Documents and Settings\Administrator>net start oracleservicexe
          OracleServiceXE 服務(wù)正在啟動(dòng) .........
          OracleServiceXE 服務(wù)已經(jīng)啟動(dòng)成功。

          2 以sys用戶登錄
          C:\Documents and Settings\Administrator>sqlplus /nolog

          SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 5月 30 22:07:45 2006

          Copyright (c) 1982, 2005, Oracle.  All rights reserved.

          SQL> conn / as sysdba
          已連接。
          3 查看現(xiàn)有的字符集設(shè)置
          SQL> set lines 140
          SQL> select * from nls_database_parameters;

          PARAMETER
          ------------------------------------------------------------
          VALUE
          -------------------------------------------------------------------
          ------------------------------------------------------------
          NLS_LANGUAGE
          AMERICAN

          NLS_TERRITORY
          AMERICA

          NLS_CURRENCY
          $

          NLS_ISO_CURRENCY
          AMERICA

          NLS_NUMERIC_CHARACTERS
          .,

          NLS_CHARACTERSET
          AL32UTF8

          NLS_CALENDAR
          GREGORIAN

          NLS_DATE_FORMAT
          DD-MON-RR

          NLS_DATE_LANGUAGE
          AMERICAN

          NLS_SORT
          BINARY

          NLS_TIME_FORMAT
          HH.MI.SSXFF AM

          NLS_TIMESTAMP_FORMAT
          DD-MON-RR HH.MI.SSXFF AM

          NLS_TIME_TZ_FORMAT
          HH.MI.SSXFF AM TZR

          NLS_TIMESTAMP_TZ_FORMAT
          DD-MON-RR HH.MI.SSXFF AM TZR

          NLS_DUAL_CURRENCY
          $

          NLS_COMP
          BINARY

          NLS_LENGTH_SEMANTICS
          BYTE

          NLS_NCHAR_CONV_EXCP
          FALSE

          NLS_NCHAR_CHARACTERSET
          AL16UTF16

          NLS_RDBMS_VERSION
          10.2.0.1.0


          已選擇20行。

          SQL> select lengthb('擇') from dual;

          LENGTHB('擇')
          -------------
                      3

          已選擇 1 行。

          我們可以看到,當(dāng)前AL32UTF8字符集1個(gè)漢字占用3個(gè)字節(jié)
          4 關(guān)閉數(shù)據(jù)庫(kù),但不停止服務(wù)
          QL> shutdown immediate
          數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫(kù)。
          ORACLE 例程已經(jīng)關(guān)閉。
          5 用修改過(guò)的pfile test.ora啟動(dòng)數(shù)據(jù)庫(kù)(nomount)
          SQL> startup nomount pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
          ORACLE 例程已經(jīng)啟動(dòng)。

          Total System Global Area  285212672 bytes
          Fixed Size                  1287016 bytes
          Variable Size              92277912 bytes
          Database Buffers          188743680 bytes
          Redo Buffers                2904064 bytes
          6 執(zhí)行建立數(shù)據(jù)庫(kù)腳本
          SQL> CREATE DATABASE XE
            2  CONTROLFILE REUSE
            3  LOGFILE
            4  GROUP 1 'E:\ORADATA\TEST\REDO01.LOG' SIZE 10M,
            5  GROUP 2 'E:\ORADATA\TEST\REDO02.LOG' SIZE 10M,
            6  GROUP 3 'E:\ORADATA\TEST\REDO03.LOG' SIZE 10M
            7  DATAFILE 'E:\ORADATA\TEST\SYSTEM01.DBF' SIZE 400M
            8  AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
            9  SYSAUX DATAFILE 'E:\ORADATA\TEST\SYSAUX01.DBF' SIZE 250M
           10  AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
           11  DEFAULT TEMPORARY TABLESPACE temp
           12  TEMPFILE 'E:\ORADATA\TEST\TEMP01.DBF' SIZE 100M
           13  AUTOEXTEND ON NEXT 100M MAXSIZE 8000M
           14  UNDO TABLESPACE undo
           15  DATAFILE 'E:\ORADATA\TEST\undo01.DBF' SIZE 200M
           16  AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
           17  CHARACTER SET ZHS16GBK
           18  NATIONAL CHARACTER SET AL16UTF16
           19  USER SYS IDENTIFIED BY SYS
           20  USER SYSTEM IDENTIFIED BY SYS
           21  ;

          數(shù)據(jù)庫(kù)已創(chuàng)建。
          7 執(zhí)行創(chuàng)建數(shù)據(jù)字典和程序包的系統(tǒng)SQL腳本
          @F:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catalog.sql
          @F:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catproc.sql
          大約需要10幾分鐘
          8 關(guān)閉數(shù)據(jù)庫(kù),但不停止服務(wù)
          SQL> shutdown immediate
          數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫(kù)。
          ORACLE 例程已經(jīng)關(guān)閉。
          9 用修改過(guò)的pfile test.ora啟動(dòng)數(shù)據(jù)庫(kù)
          SQL> startup  pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
          ORACLE 例程已經(jīng)啟動(dòng)。

          Total System Global Area  285212672 bytes
          Fixed Size                  1287016 bytes
          Variable Size              92277912 bytes
          Database Buffers          188743680 bytes
          Redo Buffers                2904064 bytes
          數(shù)據(jù)庫(kù)裝載完畢。
          數(shù)據(jù)庫(kù)已經(jīng)打開(kāi)。
          10 查看新建數(shù)據(jù)庫(kù)的字符集設(shè)置
          SQL> set lines 140
          SQL> select * from nls_database_parameters;

          PARAMETER                      VALUE
          ------------------------------ -------------------------------------------------
          -------------------------------
          NLS_LANGUAGE                   AMERICAN
          NLS_TERRITORY                  AMERICA
          NLS_CURRENCY                   $
          NLS_ISO_CURRENCY               AMERICA
          NLS_NUMERIC_CHARACTERS         .,
          NLS_CHARACTERSET               ZHS16GBK
          NLS_CALENDAR                   GREGORIAN
          NLS_DATE_FORMAT                DD-MON-RR
          NLS_DATE_LANGUAGE              AMERICAN
          NLS_SORT                       BINARY
          NLS_TIME_FORMAT                HH.MI.SSXFF AM
          NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
          NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
          NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
          NLS_DUAL_CURRENCY              $
          NLS_COMP                       BINARY
          NLS_LENGTH_SEMANTICS           BYTE
          NLS_NCHAR_CONV_EXCP            FALSE
          NLS_NCHAR_CHARACTERSET         AL16UTF16
          NLS_RDBMS_VERSION              10.2.0.1.0

          已選擇20行。

          SQL> select lengthb('A') from dual;

          LENGTHB('A')
          ------------
                     1

          已選擇 1 行。

          SQL> select lengthb('擇') from dual;

          LENGTHB('擇')
          -------------
                      2

          已選擇 1 行。
          可見(jiàn)我們新的數(shù)據(jù)庫(kù)的確是ZHS16GBK字符集,1個(gè)漢字占用2個(gè)字節(jié)
          11 要啟動(dòng)舊數(shù)據(jù)庫(kù)(因?yàn)樾屡f數(shù)據(jù)庫(kù)同名,而且oracle xe限制同時(shí)只能打開(kāi)一個(gè)數(shù)據(jù)庫(kù))
          SQL> shutdown immediate
          數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫(kù)。
          ORACLE 例程已經(jīng)關(guān)閉。
          SQL> startup
          ORACLE 例程已經(jīng)啟動(dòng)。

          Total System Global Area  285212672 bytes
          Fixed Size                  1287016 bytes
          Variable Size              96472216 bytes
          Database Buffers          184549376 bytes
          Redo Buffers                2904064 bytes
          數(shù)據(jù)庫(kù)裝載完畢。
          數(shù)據(jù)庫(kù)已經(jīng)打開(kāi)。

          ----

          如果以后要用spfile自動(dòng)新建數(shù)據(jù)庫(kù)
          SQL> create spfile from pfile='D:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora';

          文件已創(chuàng)建。

          SQL> shutdown immediate;
          數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫(kù)。
          ORACLE 例程已經(jīng)關(guān)閉。
          SQL> startup
          ORACLE 例程已經(jīng)啟動(dòng)。

          Total System Global Area 285212672 bytes
          Fixed Size 1287016 bytes
          Variable Size 92277912 bytes
          Database Buffers 188743680 bytes
          Redo Buffers 2904064 bytes
          數(shù)據(jù)庫(kù)裝載完畢。
          數(shù)據(jù)庫(kù)已經(jīng)打開(kāi)。
          SQL> select lengthb('擇') from dual;

          LENGTHB('擇')
          -------------
          2

          已選擇 1 行。

          遠(yuǎn)程登錄,客戶端也需要10g
          SQL> conn system/sys@//10.6.xx.xx:1521/XE
          已連接。
          SQL> conn sys/sys@//10.6.xx.xx:1521/XE as sysdba
          已連接。

          [url]http://www.itpub.net/558697.html[/url]
          的問(wèn)題也算得到了解決

           

          本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/l1t/archive/2006/05/31/765125.aspx

          posted @ 2009-12-28 15:17 久久不醉 閱讀(629) | 評(píng)論 (0)編輯 收藏
           

                  數(shù)據(jù)字典dict總是屬于Oracle用戶sys的。
            1、用戶:
             select username from dba_users;
            改口令
             alter user spgroup identified by spgtest;
            2、表空間:
             select * from dba_data_files;
             select * from dba_tablespaces;//表空間

             select tablespace_name,sum(bytes), sum(blocks)
              from dba_free_space group by tablespace_name;//空閑表空間

             select * from dba_data_files
              where tablespace_name='RBS';//表空間對(duì)應(yīng)的數(shù)據(jù)文件

             select * from dba_segments
              where tablespace_name='INDEXS';
            3、數(shù)據(jù)庫(kù)對(duì)象:
             select * from dba_objects;
             CLUSTER、DATABASE LINK、FUNCTION、INDEX、LIBRARY、PACKAGE、PACKAGE BODY、
             PROCEDURE、SEQUENCE、SYNONYM、TABLE、TRIGGER、TYPE、UNDEFINED、VIEW。
            4、表:
             select * from dba_tables;
             analyze my_table compute statistics;->dba_tables后6列
             select extent_id,bytes from dba_extents
             where segment_name='CUSTOMERS' and segment_type='TABLE'
             order by extent_id;//表使用的extent的信息。segment_type='ROLLBACK'查看回滾段的空間分配信息
             列信息:
              select distinct table_name
              from user_tab_columns
              where column_name='SO_TYPE_ID';
            5、索引: 
             select * from dba_indexes;//索引,包括主鍵索引
             select * from dba_ind_columns;//索引列
             select i.index_name,i.uniqueness,c.column_name
              from user_indexes i,user_ind_columns c
               where i.index_name=c.index_name
               and i.table_name ='ACC_NBR';//聯(lián)接使用
            6、序列:
             select * from dba_sequences;
            7、視圖:
             select * from dba_views;
             select * from all_views;
            text 可用于查詢視圖生成的腳本
            8、聚簇:
             select * from dba_clusters;
            9、快照:
             select * from dba_snapshots;
            快照、分區(qū)應(yīng)存在相應(yīng)的表空間。
            10、同義詞:
             select * from dba_synonyms
              where table_owner='SPGROUP';
              //if owner is PUBLIC,then the synonyms is a public synonym.
               if owner is one of users,then the synonyms is a private synonym.
            11、數(shù)據(jù)庫(kù)鏈:
             select * from dba_db_links;
            在spbase下建數(shù)據(jù)庫(kù)鏈
             create database link dbl_spnew
             connect to spnew identified by spnew using 'jhhx';
             insert into acc_nbr@dbl_spnew
             select * from acc_nbr where nxx_nbr='237' and line_nbr='8888';
            12、觸發(fā)器:
             select * from dba_trigers;
            存儲(chǔ)過(guò)程,函數(shù)從dba_objects查找。
            其文本:select text from user_source where name='BOOK_SP_EXAMPLE';
            建立出錯(cuò):select * from user_errors;
            oracle總是將存儲(chǔ)過(guò)程,函數(shù)等軟件放在SYSTEM表空間。
            13、約束:
            (1)約束是和表關(guān)聯(lián)的,可在create table或alter table table_name add/drop/modify來(lái)建立、修改、刪除約束。
            可以臨時(shí)禁止約束,如:
             alter table book_example
             disable constraint book_example_1;
             alter table book_example
             enable constraint book_example_1;
            (2)主鍵和外鍵被稱為表約束,而not null和unique之類的約束被稱為列約束。通常將主鍵和外鍵作為單獨(dú)的命名約束放在字段列表下面,而列約束可放在列定義的同一行,這樣更具有可讀性。
            (3)列約束可從表定義看出,即describe;表約束即主鍵和外鍵,可從dba_constraints和dba_cons_columns 查。
             select * from user_constraints
             where table_name='BOOK_EXAMPLE';
             select owner,CONSTRAINT_NAME,TABLE_NAME
              from user_constraints
              where constraint_type='R'
              order by table_name;
            (4)定義約束可以無(wú)名(系統(tǒng)自動(dòng)生成約束名)和自己定義約束名(特別是主鍵、外鍵)
            如:create table book_example
              (identifier number not null);
              create table book_example
              (identifier number constranit book_example_1 not null);
            14、回滾段:
            在所有的修改結(jié)果存入磁盤(pán)前,回滾段中保持恢復(fù)該事務(wù)所需的全部信息,必須以數(shù)據(jù)庫(kù)發(fā)生的事務(wù)來(lái)相應(yīng)確定其大小(DML語(yǔ)句才可回滾,create,drop,truncate等DDL不能回滾)。
            回滾段數(shù)量=并發(fā)事務(wù)/4,但不能超過(guò)50;使每個(gè)回滾段大小足夠處理一個(gè)完整的事務(wù);
             create rollback segment r05
             tablespace rbs;
             create rollback segment rbs_cvt
             tablespace rbs
             storage(initial 1M next 500k);
            使回滾段在線
             alter rollback segment r04 online;
            用dba_extents,v$rollback_segs監(jiān)測(cè)回滾段的大小和動(dòng)態(tài)增長(zhǎng)。
            回滾段的區(qū)間信息
             select * from dba_extents
             where segment_type='ROLLBACK' and segment_name='RB1';
            回滾段的段信息,其中bytes顯示目前回滾段的字節(jié)數(shù)
             select * from dba_segments
              where segment_type='ROLLBACK' and segment_name='RB1';
            為事物指定回歸段
             set transaction use rollback segment rbs_cvt
            針對(duì)bytes可以使用回滾段回縮。
             alter rollback segment rbs_cvt shrink;
             select bytes,extents,max_extents from dba_segments
              where segment_type='ROLLBACK' and segment_name='RBS_CVT';
            回滾段的當(dāng)前狀態(tài)信息:
             select * from dba_rollback_segs
              where segment_name='RB1';
            比多回滾段狀態(tài)status,回滾段所屬實(shí)例instance_num
            查優(yōu)化值optimal
             select n.name,s.optsize
              from v$rollname n,v$rollstat s
               where n.usn=s.usn;
            回滾段中的數(shù)據(jù)
             set transaction use rollback segment rb1;/*回滾段名*/
             select n.name,s.writes
              from v$rollname n,v$rollstat s
               where n.usn=s.usn;
            當(dāng)事務(wù)處理完畢,再次查詢$rollstat,比較writes(回滾段條目字節(jié)數(shù))差值,可確定事務(wù)的大小。
            查詢回滾段中的事務(wù)
             column rr heading 'RB Segment' format a18
             column us heading 'Username' format a15
             column os heading 'Os User' format a10
             column te heading 'Terminal' format a10
             select r.name rr,nvl(s.username,'no transaction') us,s.osuser os,s.terminal te
              from v$lock l,v$session s,v$rollname r
               where l.sid=s.sid(+)
               and trunc(l.id1/65536)=R.USN
               and l.type='TX'
               and l.lmode=6
             order by r.name;
            15、作業(yè)
            查詢作業(yè)信息
             select job,broken,next_date,interval,what from user_jobs;
             select job,broken,next_date,interval,what from dba_jobs;
            查詢正在運(yùn)行的作業(yè)
             select * from dba_jobs_running;
            使用包exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (10/(24*60*60))')加入作業(yè)。間隔10秒鐘
          exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (11/(24*60))')加入作業(yè)。間隔11分鐘使用包exec dbms_job.remove(21)刪除21號(hào)作業(yè)。

          posted @ 2009-12-22 15:56 久久不醉 閱讀(150) | 評(píng)論 (0)編輯 收藏
           
          一、什么是Java事務(wù)
          通常的觀念認(rèn)為,事務(wù)僅與數(shù)據(jù)庫(kù)相關(guān)。
          事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫(xiě)。事務(wù)的原子性表示事務(wù)執(zhí)行過(guò)程中的任何失敗都將導(dǎo)致事務(wù)所做的任何修改失效。一致性表示當(dāng)事務(wù)執(zhí)行失敗時(shí),所有被該事務(wù)影響的數(shù)據(jù)都應(yīng)該恢復(fù)到事務(wù)執(zhí)行前的狀態(tài)。隔離性表示在事務(wù)執(zhí)行過(guò)程中對(duì)數(shù)據(jù)的修改,在事務(wù)提交之前對(duì)其他事務(wù)不可見(jiàn)。持久性表示已提交的數(shù)據(jù)在事務(wù)執(zhí)行失敗時(shí),數(shù)據(jù)的狀態(tài)都應(yīng)該正確。
          通俗的理解,事務(wù)是一組原子操作單元,從數(shù)據(jù)庫(kù)角度說(shuō),就是一組SQL指令,要么全部執(zhí)行成功,若因?yàn)槟硞€(gè)原因其中一條指令執(zhí)行有錯(cuò)誤,則撤銷先前執(zhí)行過(guò)的所有指令。更簡(jiǎn)答的說(shuō)就是:要么全部執(zhí)行成功,要么撤銷不執(zhí)行。
          既然事務(wù)的概念從數(shù)據(jù)庫(kù)而來(lái),那Java事務(wù)是什么?之間有什么聯(lián)系?
          實(shí)際上,一個(gè)Java應(yīng)用系統(tǒng),如果要操作數(shù)據(jù)庫(kù),則通過(guò)JDBC來(lái)實(shí)現(xiàn)的。增加、修改、刪除都是通過(guò)相應(yīng)方法間接來(lái)實(shí)現(xiàn)的,事務(wù)的控制也相應(yīng)轉(zhuǎn)移到Java程序代碼中。因此,數(shù)據(jù)庫(kù)操作的事務(wù)習(xí)慣上就稱為Java事務(wù)。
          二、為什么需要事務(wù)
          事務(wù)是為解決數(shù)據(jù)安全操作提出的,事務(wù)控制實(shí)際上就是控制數(shù)據(jù)的安全訪問(wèn)。具一個(gè)簡(jiǎn)單例子:比如銀行轉(zhuǎn)帳業(yè)務(wù),賬戶A要將自己賬戶上的1000元轉(zhuǎn)到B賬戶下面,A賬戶余額首先要減去1000元,然后B賬戶要增加1000元。假如在中間網(wǎng)絡(luò)出現(xiàn)了問(wèn)題,A賬戶減去1000元已經(jīng)結(jié)束,B因?yàn)榫W(wǎng)絡(luò)中斷而操作失敗,那么整個(gè)業(yè)務(wù)失敗,必須做出控制,要求A賬戶轉(zhuǎn)帳業(yè)務(wù)撤銷。這才能保證業(yè)務(wù)的正確性,完成這個(gè)操走就需要事務(wù),將A賬戶資金減少和B賬戶資金增加方到一個(gè)事務(wù)里面,要么全部執(zhí)行成功,要么操作全部撤銷,這樣就保持了數(shù)據(jù)的安全性。
          三、Java事務(wù)的類型
          Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù)。
          1、JDBC事務(wù)
          JDBC 事務(wù)是用 Connection 對(duì)象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。 java.sql.Connection 提供了以下控制事務(wù)的方法:
          public void setAutoCommit(boolean)
          public boolean getAutoCommit()
          public void commit()
          public void rollback()
          使用 JDBC 事務(wù)界定時(shí),您可以將多個(gè) SQL 語(yǔ)句結(jié)合到一個(gè)事務(wù)中。JDBC 事務(wù)的一個(gè)缺點(diǎn)是事務(wù)的范圍局限于一個(gè)數(shù)據(jù)庫(kù)連接。一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫(kù)。
          2、JTA(Java Transaction API)事務(wù)
          JTA是一種高層的,與實(shí)現(xiàn)無(wú)關(guān)的,與協(xié)議無(wú)關(guān)的API,應(yīng)用程序和應(yīng)用服務(wù)器可以使用JTA來(lái)訪問(wèn)事務(wù)。
          JTA允許應(yīng)用程序執(zhí)行分布式事務(wù)處理--在兩個(gè)或多個(gè)網(wǎng)絡(luò)計(jì)算機(jī)資源上訪問(wèn)并且更新數(shù)據(jù),這些數(shù)據(jù)可以分布在多個(gè)數(shù)據(jù)庫(kù)上。JDBC驅(qū)動(dòng)程序的JTA支持極大地增強(qiáng)了數(shù)據(jù)訪問(wèn)能力。
          如果計(jì)劃用 JTA 界定事務(wù),那么就需要有一個(gè)實(shí)現(xiàn) javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅(qū)動(dòng)程序。一個(gè)實(shí)現(xiàn)了這些接口的驅(qū)動(dòng)程序?qū)⒖梢詤⑴c JTA 事務(wù)。一個(gè) XADataSource 對(duì)象就是一個(gè) XAConnection 對(duì)象的工廠。 XAConnection s 是參與 JTA 事務(wù)的 JDBC 連接。
          您將需要用應(yīng)用服務(wù)器的管理工具設(shè)置 XADataSource 。從應(yīng)用服務(wù)器和 JDBC 驅(qū)動(dòng)程序的文檔中可以了解到相關(guān)的指導(dǎo)。
          J2EE 應(yīng)用程序用 JNDI 查詢數(shù)據(jù)源。一旦應(yīng)用程序找到了數(shù)據(jù)源對(duì)象,它就調(diào)用 javax.sql.DataSource.getConnection() 以獲得到數(shù)據(jù)庫(kù)的連接。
          XA 連接與非 XA 連接不同。一定要記住 XA 連接參與了 JTA 事務(wù)。這意味著 XA 連接不支持 JDBC 的自動(dòng)提交功能。同時(shí),應(yīng)用程序一定不要對(duì) XA 連接調(diào)用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。相反,應(yīng)用程序應(yīng)該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
          3、容器事務(wù)
          容器事務(wù)主要是J2EE應(yīng)用服務(wù)器提供的,容器事務(wù)大多是基于JTA完成,這是一個(gè)基于JNDI的,相當(dāng)復(fù)雜的API實(shí)現(xiàn)。相對(duì)編碼實(shí)現(xiàn)JTA事務(wù)管理,我們可以通過(guò)EJB容器提供的容器事務(wù)管理機(jī)制(CMT)完成同一個(gè)功能,這項(xiàng)功能由J2EE應(yīng)用服務(wù)器提供。這使得我們可以簡(jiǎn)單的指定將哪個(gè)方法加入事務(wù),一旦指定,容器將負(fù)責(zé)事務(wù)管理任務(wù)。這是我們土建的解決方式,因?yàn)橥ㄟ^(guò)這種方式我們可以將事務(wù)代碼排除在邏輯編碼之外,同時(shí)將所有困難交給J2EE容器去解決。使用EJB CMT的另外一個(gè)好處就是程序員無(wú)需關(guān)心JTA API的編碼,不過(guò),理論上我們必須使用EJB。
          四、三種事務(wù)差異
          1、JDBC事務(wù)控制的局限性在一個(gè)數(shù)據(jù)庫(kù)連接內(nèi),但是其使用簡(jiǎn)單。
          2、JTA事務(wù)的功能強(qiáng)大,事務(wù)可以跨越多個(gè)數(shù)據(jù)庫(kù)或多個(gè)DAO,使用也比較復(fù)雜。
          3、容器事務(wù),主要指的是J2EE應(yīng)用服務(wù)器提供的事務(wù)管理,局限于EJB應(yīng)用使用。
          五、總結(jié)
          事務(wù)控制是構(gòu)建J2EE應(yīng)用不可缺少的一部分,合理選擇應(yīng)用何種事務(wù)對(duì)整個(gè)應(yīng)用系統(tǒng)來(lái)說(shuō)至關(guān)重要。一般說(shuō)來(lái),在單個(gè)JDBC 連接連接的情況下可以選擇JDBC事務(wù),在跨多個(gè)連接或者數(shù)據(jù)庫(kù)情況下,需要選擇使用JTA事務(wù),如果用到了EJB,則可以考慮使用EJB容器事務(wù)。
          參考資料:
          《Pro Spring》
          posted @ 2009-09-23 16:19 久久不醉 閱讀(143) | 評(píng)論 (0)編輯 收藏
           
               摘要: 一、cookie機(jī)制和session機(jī)制的區(qū)別 *************************************************************************************        具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)...  閱讀全文
          posted @ 2009-09-22 15:54 久久不醉 閱讀(125) | 評(píng)論 (0)編輯 收藏
           
          在SQL語(yǔ)句優(yōu)化過(guò)程中,經(jīng)常會(huì)用到hint, 
          以下是在SQL優(yōu)化過(guò)程中常見(jiàn)Oracle中"HINT"的30個(gè)用法1. /*+ALL_ROWS*/ 
          表明對(duì)語(yǔ)句塊選擇基于開(kāi)銷的優(yōu)化方法,并獲得最佳吞吐量,使資源消耗最小化. 
          例如: 
          SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

          2. /*+FIRST_ROWS*/ 
          表明對(duì)語(yǔ)句塊選擇基于開(kāi)銷的優(yōu)化方法,并獲得最佳響應(yīng)時(shí)間,使資源消耗最小化. 
          例如: 
          SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

          3. /*+CHOOSE*/ 
          表明如果數(shù)據(jù)字典中有訪問(wèn)表的統(tǒng)計(jì)信息,將基于開(kāi)銷的優(yōu)化方法,并獲得最佳的吞吐量; 
          表明如果數(shù)據(jù)字典中沒(méi)有訪問(wèn)表的統(tǒng)計(jì)信息,將基于規(guī)則開(kāi)銷的優(yōu)化方法; 
          例如: 
          SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

          4. /*+RULE*/ 
          表明對(duì)語(yǔ)句塊選擇基于規(guī)則的優(yōu)化方法. 
          例如: 
          SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

          5. /*+FULL(TABLE)*/ 
          表明對(duì)表選擇全局掃描的方法. 
          例如: 
          SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT'; 

          6. /*+ROWID(TABLE)*/ 
          提示明確表明對(duì)指定表根據(jù)ROWID進(jìn)行訪問(wèn). 
          例如: 
          SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA' 
          AND EMP_NO='SCOTT'; 

          7. /*+CLUSTER(TABLE)*/ 
          提示明確表明對(duì)指定表選擇簇掃描的訪問(wèn)方法,它只對(duì)簇對(duì)象有效. 
          例如: 
          SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS 
          WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

          8. /*+INDEX(TABLE INDEX_NAME)*/ 
          表明對(duì)表選擇索引的掃描方法. 
          例如: 
          SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M'; 

          9. /*+INDEX_ASC(TABLE INDEX_NAME)*/ 
          表明對(duì)表選擇索引升序的掃描方法. 
          例如: 
          SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT'; 

          10. /*+INDEX_COMBINE*/ 
          為指定表選擇位圖訪問(wèn)路經(jīng),如果INDEX_COMBINE中沒(méi)有提供作為參數(shù)的索引,將選擇出位圖索引的布爾組合方式. 
          例如: 
          SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS 
          WHERE SAL<5000000 AND HIREDATE<SYSDATE; 

          11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/ 
          提示明確命令優(yōu)化器使用索引作為訪問(wèn)路徑. 
          例如: 
          SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE 
          FROM BSEMPMS WHERE SAL<60000; 

          12. /*+INDEX_DESC(TABLE INDEX_NAME)*/ 
          表明對(duì)表選擇索引降序的掃描方法. 
          例如: 
          SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT'; 

          13. /*+INDEX_FFS(TABLE INDEX_NAME)*/ 
          對(duì)指定的表執(zhí)行快速全索引掃描,而不是全表掃描的辦法. 
          例如: 
          SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305'; 

          14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/ 
          提示明確進(jìn)行執(zhí)行規(guī)劃的選擇,將幾個(gè)單列索引的掃描合起來(lái). 
          例如: 
          SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306'; 

          15. /*+USE_CONCAT*/ 
          對(duì)查詢中的WHERE后面的OR條件進(jìn)行轉(zhuǎn)換為UNION ALL的組合查詢. 
          例如: 
          SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M'; 

          16. /*+NO_EXPAND*/ 
          對(duì)于WHERE后面的OR 或者IN-LIST的查詢語(yǔ)句,NO_EXPAND將阻止其基于優(yōu)化器對(duì)其進(jìn)行擴(kuò)展. 
          例如: 
          SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M'; 

          17. /*+NOWRITE*/ 
          禁止對(duì)查詢塊的查詢重寫(xiě)操作. 

          18. /*+REWRITE*/ 
          可以將視圖作為參數(shù). 

          19. /*+MERGE(TABLE)*/ 
          能夠?qū)σ晥D的各個(gè)查詢進(jìn)行相應(yīng)的合并. 
          例如: 
          SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO 
          ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO 
          AND A.SAL>V.AVG_SAL; 

          20. /*+NO_MERGE(TABLE)*/ 
          對(duì)于有可合并的視圖不再合并. 
          例如: 
          SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL; 

          21. /*+ORDERED*/ 
          根據(jù)表出現(xiàn)在FROM中的順序,ORDERED使ORACLE依此順序?qū)ζ溥B接. 
          例如: 
          SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1; 

          22. /*+USE_NL(TABLE)*/ 
          將指定表與嵌套的連接的行源進(jìn)行連接,并把指定表作為內(nèi)部表. 
          例如: 
          SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

          23. /*+USE_MERGE(TABLE)*/ 
          將指定的表與其他行源通過(guò)合并排序連接方式連接起來(lái). 
          例如: 
          SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

          24. /*+USE_HASH(TABLE)*/ 
          將指定的表與其他行源通過(guò)哈希連接方式連接起來(lái). 
          例如: 
          SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

          25. /*+DRIVING_SITE(TABLE)*/ 
          強(qiáng)制與ORACLE所選擇的位置不同的表進(jìn)行查詢執(zhí)行. 
          例如: 
          SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO; 

          26. /*+LEADING(TABLE)*/ 
          將指定的表作為連接次序中的首表. 

          27. /*+CACHE(TABLE)*/ 
          當(dāng)進(jìn)行全表掃描時(shí),CACHE提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表LRU的最近使用端 
          例如: 
          SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 

          28. /*+NOCACHE(TABLE)*/ 
          當(dāng)進(jìn)行全表掃描時(shí),CACHE提示能夠?qū)⒈淼臋z索塊放置在緩沖區(qū)緩存中最近最少列表LRU的最近使用端 
          例如: 
          SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 

          29. /*+APPEND*/ 
          直接插入到表的最后,可以提高速度. 
          insert /*+append*/ into test1 select * from test4 ; 

          30. /*+NOAPPEND*/ 
          通過(guò)在插入語(yǔ)句生存期內(nèi)停止并行模式來(lái)啟動(dòng)常規(guī)插入. 
          insert /*+noappend*/ into test1 select * from test4 ;

          posted @ 2009-09-15 16:11 久久不醉 閱讀(121) | 評(píng)論 (0)編輯 收藏
           
          前段時(shí)間對(duì)Spring的事務(wù)配置做了比較深入的研究,在此之間對(duì)Spring的事務(wù)配置雖說(shuō)也配置過(guò),但是一直沒(méi)有一個(gè)清楚的認(rèn)識(shí)。通過(guò)這次的學(xué)習(xí)發(fā)覺(jué)Spring的事務(wù)配置只要把思路理清,還是比較好掌握的。

          總結(jié)如下:

          Spring配置文件中關(guān)于事務(wù)配置總是由三個(gè)組成部分,分別是DataSource、TransactionManager和代理機(jī)制這三部分,無(wú)論哪種配置方式,一般變化的只是代理機(jī)制這部分。

          DataSource、TransactionManager這兩部分只是會(huì)根據(jù)數(shù)據(jù)訪問(wèn)方式有所變化,比如使用Hibernate進(jìn)行數(shù)據(jù)訪問(wèn) 時(shí),DataSource實(shí)際為SessionFactory,TransactionManager的實(shí)現(xiàn)為 HibernateTransactionManager。



          根據(jù)代理機(jī)制的不同,總結(jié)了五種Spring事務(wù)的配置方式,配置文件如下:

              第一種方式:每個(gè)Bean都有一個(gè)代理

          Java代碼
          1. <bean id="sessionFactory"    
          2.            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
          3.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
          4.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
          5.     </bean>    
          6.   
          7.     <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->    
          8.     <bean id="transactionManager"  
          9.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
          10.         <property name="sessionFactory" ref="sessionFactory" />  
          11.     </bean>  
          12.      
          13.     <!-- 配置DAO -->  
          14.     <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
          15.         <property name="sessionFactory" ref="sessionFactory" />  
          16.     </bean>  
          17.      
          18.     <bean id="userDao"    
          19.        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
          20.            <!-- 配置事務(wù)管理器 -->    
          21.            <property name="transactionManager" ref="transactionManager" />       
          22.         <property name="target" ref="userDaoTarget" />    
          23.          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />  
          24.         <!-- 配置事務(wù)屬性 -->    
          25.         <property name="transactionAttributes">    
          26.             <props>    
          27.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
          28.             </props>    
          29.         </property>    
          30.     </bean>    
          31. lt;/beans>  

          第二種方式:所有Bean共享一個(gè)代理基類

          Java代碼
          1. <bean id="sessionFactory"    
          2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
          3.          <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
          4.          <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
          5.      </bean>    
          6.   
          7.      <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->    
          8.      <bean id="transactionManager"  
          9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
          10.          <property name="sessionFactory" ref="sessionFactory" />  
          11.      </bean>  
          12.       
          13.      <bean id="transactionBase"    
          14.             class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    
          15.              lazy-init="true" abstract="true">    
          16.          <!-- 配置事務(wù)管理器 -->    
          17.          <property name="transactionManager" ref="transactionManager" />    
          18.          <!-- 配置事務(wù)屬性 -->    
          19.          <property name="transactionAttributes">    
          20.              <props>    
          21.                  <prop key="*">PROPAGATION_REQUIRED</prop>    
          22.              </props>    
          23.          </property>    
          24.      </bean>      
          25.      
          26.      <!-- 配置DAO -->  
          27.      <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">  
          28.          <property name="sessionFactory" ref="sessionFactory" />  
          29.      </bean>  
          30.       
          31.      <bean id="userDao" parent="transactionBase" >    
          32.          <property name="target" ref="userDaoTarget" />     
          33.      </bean>  
          34. </beans>

          第三種方式:使用攔截器

          Java代碼
          1. <bean id="sessionFactory"    
          2.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
          3.          <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
          4.          <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
          5.      </bean>    
          6.   
          7.      <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->    
          8.      <bean id="transactionManager"  
          9.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
          10.          <property name="sessionFactory" ref="sessionFactory" />  
          11.      </bean>   
          12.      
          13.      <bean id="transactionInterceptor"    
          14.         class="org.springframework.transaction.interceptor.TransactionInterceptor">    
          15.          <property name="transactionManager" ref="transactionManager" />    
          16.          <!-- 配置事務(wù)屬性 -->    
          17.          <property name="transactionAttributes">    
          18.              <props>    
          19.                  <prop key="*">PROPAGATION_REQUIRED</prop>    
          20.              </props>    
          21.          </property>    
          22.      </bean>  
          23.         
          24.      <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
          25.          <property name="beanNames">    
          26.              <list>    
          27.                  <value>*Dao</value>  
          28.              </list>    
          29.          </property>    
          30.          <property name="interceptorNames">    
          31.              <list>    
          32.                  <value>transactionInterceptor</value>    
          33.              </list>    
          34.          </property>    
          35.      </bean>    
          36.     
          37.      <!-- 配置DAO -->  
          38.      <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">  
          39.          <property name="sessionFactory" ref="sessionFactory" />  
          40.      </bean>  
          41. </beans>  

          第四種方式:使用tx標(biāo)簽配置的攔截器

          Java代碼
          1. <context:annotation-config />  
          2.     <context:component-scan base-package="com.bluesky" />  
          3.   
          4.     <bean id="sessionFactory"    
          5.            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
          6.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
          7.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
          8.     </bean>    
          9.   
          10.     <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->    
          11.     <bean id="transactionManager"  
          12.        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
          13.         <property name="sessionFactory" ref="sessionFactory" />  
          14.     </bean>  
          15.   
          16.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
          17.         <tx:attributes>  
          18.             <tx:method name="*" propagation="REQUIRED" />  
          19.         </tx:attributes>  
          20.     </tx:advice>  
          21.      
          22.     <aop:config>  
          23.         <aop:pointcut id="interceptorPointCuts"  
          24.             expression="execution(* com.bluesky.spring.dao.*.*(..))" />  
          25.         <aop:advisor advice-ref="txAdvice"  
          26.             pointcut-ref="interceptorPointCuts" />          
          27.     </aop:config>        
          28. </beans>

          第五種方式:全注解

          Java代碼
          1. <context:annotation-config />  
          2.      <context:component-scan base-package="com.bluesky" />  
          3.   
          4.      <tx:annotation-driven transaction-manager="transactionManager"/>  
          5.   
          6.      <bean id="sessionFactory"    
          7.             class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    
          8.          <property name="configLocation" value="classpath:hibernate.cfg.xml" />    
          9.          <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
          10.      </bean>    
          11.   
          12.      <!-- 定義事務(wù)管理器(聲明式的事務(wù)) -->    
          13.      <bean id="transactionManager"  
          14.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
          15.          <property name="sessionFactory" ref="sessionFactory" />  
          16.      </bean>  
          17.       
          18. </beans>  

          此時(shí)在DAO上需加上@Transactional注解,如下:

          Java代碼
          1. package com.bluesky.spring.dao;  
          2.   
          3. import java.util.List;  
          4.   
          5. import org.hibernate.SessionFactory;  
          6. import org.springframework.beans.factory.annotation.Autowired;  
          7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
          8. import org.springframework.stereotype.Component;  
          9.   
          10. import com.bluesky.spring.domain.User;  
          11.   
          12. @Transactional  
          13. @Component("userDao")  
          14. public class UserDaoImpl extends HibernateDaoSupport implements UserDao {  
          15.   
          16.     public List<User> listUsers() {  
          17.         return this.getSession().createQuery("from User").list();  
          18.      }  
          19.       
          20.       
          posted @ 2009-09-10 14:22 久久不醉 閱讀(150) | 評(píng)論 (0)編輯 收藏
           
               摘要: 利用xfire編寫(xiě)webservice的例子,內(nèi)容如下 1. xfire + spring 發(fā)布webservice 2. 利用 javascript  調(diào)用發(fā)布的webservice 使用xfire+spring發(fā)布webservice其實(shí)很簡(jiǎn)單,遵循一下幾個(gè)步驟即可 1. 想要發(fā)布成文webservice的類,必須實(shí)現(xiàn)接口 ...  閱讀全文
          posted @ 2009-09-02 16:38 久久不醉 閱讀(3571) | 評(píng)論 (3)編輯 收藏
           
          xfire+spring 實(shí)踐記錄(一) 
          客戶端代碼: 
          1、將服務(wù)端的com.sap.jco.ws.WebServiceSAP.java接口copy到本地 
          2、新增spring的applicationcontext 
          applicationContext-client.xml 
          <?xml version="1.0" encoding="UTF-8"?> 
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 

          <beans  default-lazy-init="true"> 
          <bean id="sapWebService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean"> 
          <property name="serviceClass"> 
          <value>com.sap.jco.ws.WebServiceSAP</value> 
          </property> 
          <property name="wsdlDocumentUrl"> 
          <value>http://127.0.0.1:88/wssap/services/SAPService?WSDL</value> 
          </property> 
          </bean> 
          </beans> 

          3、applicationContext.xml中增加 
          <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />   
          <import resource="applicationContext-client.xml"/> 

          4、調(diào)用: 
          TestService client=(TestService)ServiceFactory.getBeanByName("testWebService"); 
              Map map=client.add(new HashMap(), 1, 2); 
              System.out.println("map value:"+map.get("p3")); 
          可以返回結(jié)果
          posted @ 2009-09-02 16:38 久久不醉 閱讀(549) | 評(píng)論 (0)編輯 收藏
           
          關(guān)鍵字: oracle的悲觀鎖和樂(lè)觀鎖
          為了得到最大的性能,一般數(shù)據(jù)庫(kù)都有并發(fā)機(jī)制,不過(guò)帶來(lái)的問(wèn)題就是數(shù)據(jù)訪問(wèn)的沖突。為了解決這個(gè)問(wèn)題,大多數(shù)數(shù)據(jù)庫(kù)用的方法就是數(shù)據(jù)的鎖定。 

          數(shù)據(jù)的鎖定分為兩種方法,第一種叫做悲觀鎖,第二種叫做樂(lè)觀鎖。什么叫悲觀鎖呢,悲觀鎖顧名思義,就是對(duì)數(shù)據(jù)的沖突采取一種悲觀的態(tài)度,也就是說(shuō)假設(shè)數(shù)據(jù)肯定會(huì)沖突,所以在數(shù)據(jù)開(kāi)始讀取的時(shí)候就把數(shù)據(jù)鎖定住。而樂(lè)觀鎖就是認(rèn)為數(shù)據(jù)一般情況下不會(huì)造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候,才會(huì)正式對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測(cè),如果發(fā)現(xiàn)沖突了,則讓用戶返回錯(cuò)誤的信息,讓用戶決定如何去做。 

          先從悲觀鎖開(kāi)始說(shuō)。在SqlServer等其余很多數(shù)據(jù)庫(kù)中,數(shù)據(jù)的鎖定通常采用頁(yè)級(jí)鎖的方式,也就是說(shuō)對(duì)一張表內(nèi)的數(shù)據(jù)是一種串行化的更新插入機(jī)制,在任何時(shí)間同一張表只會(huì)插1條數(shù)據(jù),別的想插入的數(shù)據(jù)要等到這一條數(shù)據(jù)插完以后才能依次插入。帶來(lái)的后果就是性能的降低,在多用戶并發(fā)訪問(wèn)的時(shí)候,當(dāng)對(duì)一張表進(jìn)行頻繁操作時(shí),會(huì)發(fā)現(xiàn)響應(yīng)效率很低,數(shù)據(jù)庫(kù)經(jīng)常處于一種假死狀態(tài)。而Oracle用的是行級(jí)鎖,只是對(duì)想鎖定的數(shù)據(jù)才進(jìn)行鎖定,其余的數(shù)據(jù)不相干,所以在對(duì)Oracle表中并發(fā)插數(shù)據(jù)的時(shí)候,基本上不會(huì)有任何影響。 

          注:對(duì)于悲觀鎖是針對(duì)并發(fā)的可能性比較大,而一般在我們的應(yīng)用中用樂(lè)觀鎖足以。 


          Oracle的悲觀鎖需要利用一條現(xiàn)有的連接,分成兩種方式,從SQL語(yǔ)句的區(qū)別來(lái)看,就是一種是for update,一種是for update nowait的形式。比如我們看一個(gè)例子。首先建立測(cè)試用的數(shù)據(jù)庫(kù)表。 

          Sql代碼 
          1. CREATE TABLE TEST(ID,NAME,LOCATION,VALUE,CONSTRAINT test_pk PRIMARY KEY(ID))AS SELECT deptno, dname, loc, 1 FROM scott.dept  



          這里我們利用了Oracle的Sample的scott用戶的表,把數(shù)據(jù)copy到我們的test表中。首先我們看一下for update鎖定方式。首先我們執(zhí)行如下的select for update語(yǔ)句。 

          Sql代碼 
          1. select * from test where id = 10 for update  


          通過(guò)這條檢索語(yǔ)句鎖定以后,再開(kāi)另外一個(gè)sql*plus窗口進(jìn)行操作,再把上面這條sql語(yǔ)句執(zhí)行一便,你會(huì)發(fā)現(xiàn)sqlplus好像死在那里了,好像檢索不到數(shù)據(jù)的樣子,但是也不返回任何結(jié)果,就屬于卡在那里的感覺(jué)。這個(gè)時(shí)候是什么原因呢,就是一開(kāi)始的第一個(gè)Session中的select for update語(yǔ)句把數(shù)據(jù)鎖定住了。由于這里鎖定的機(jī)制是wait的狀態(tài)(只要不表示nowait那就是wait),所以第二個(gè)Session(也就是卡住的那個(gè)sql*plus)中當(dāng)前這個(gè)檢索就處于等待狀態(tài)。當(dāng)?shù)谝粋€(gè)session最后commit或者rollback之后,第二個(gè)session中的檢索結(jié)果就是自動(dòng)跳出來(lái),并且也把數(shù)據(jù)鎖定住。不過(guò)如果你第二個(gè)session中你的檢索語(yǔ)句如下所示。 

          Sql代碼 
          1. select * from test where id = 10  



          也就是沒(méi)有for update這種鎖定數(shù)據(jù)的語(yǔ)句的話,就不會(huì)造成阻塞了。另外一種情況,就是當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)被鎖定的時(shí)候,也就是執(zhí)行剛才for update那條sql以后,我們?cè)诹硗庖粋€(gè)session中執(zhí)行for update nowait后又是什么樣呢。比如如下的sql語(yǔ)句。由于這條語(yǔ)句中是制定采用nowait方式來(lái)進(jìn)行檢索,所以當(dāng)發(fā)現(xiàn)數(shù)據(jù)被別的session鎖定中的時(shí)候,就會(huì)迅速返回ORA-00054錯(cuò)誤,內(nèi)容是資源正忙, 但指定以 NOWAIT 方式獲取資源。所以在程序中我們可以采用nowait方式迅速判斷當(dāng)前數(shù)據(jù)是否被鎖定中,如果鎖定中的話,就要采取相應(yīng)的業(yè)務(wù)措施進(jìn)行處理。 

          Sql代碼 
          1. select * from test where id = 10 for update nowait  



          那這里另外一個(gè)問(wèn)題,就是當(dāng)我們鎖定住數(shù)據(jù)的時(shí)候,我們對(duì)數(shù)據(jù)進(jìn)行更新和刪除的話會(huì)是什么樣呢。比如同樣,我們讓第一個(gè)Session鎖定住id=10的那條數(shù)據(jù),我們?cè)诘诙€(gè)session中執(zhí)行如下語(yǔ)句。 

          Sql代碼 
          1. update test set value=2 where id = 10  



          這個(gè)時(shí)候我們發(fā)現(xiàn)update語(yǔ)句就好像select for update語(yǔ)句一樣也停住卡在這里,當(dāng)你第一個(gè)session放開(kāi)鎖定以后update才能正常運(yùn)行。當(dāng)你update運(yùn)行后,數(shù)據(jù)又被你update 語(yǔ)句鎖定住了,這個(gè)時(shí)候只要你update后還沒(méi)有commit,別的session照樣不能對(duì)數(shù)據(jù)進(jìn)行鎖定更新等等。 

          總之,Oracle中的悲觀鎖就是利用Oracle的Connection對(duì)數(shù)據(jù)進(jìn)行鎖定。在Oracle中,用這種行級(jí)鎖帶來(lái)的性能損失是很小的,只是要注意程序邏輯,不要給你一不小心搞成死鎖了就好。而且由于數(shù)據(jù)的及時(shí)鎖定,在數(shù)據(jù)提交時(shí)候就不呼出現(xiàn)沖突,可以省去很多惱人的數(shù)據(jù)沖突處理。缺點(diǎn)就是你必須要始終有一條數(shù)據(jù)庫(kù)連接,就是說(shuō)在整個(gè)鎖定到最后放開(kāi)鎖的過(guò)程中,你的數(shù)據(jù)庫(kù)聯(lián)接要始終保持住。與悲觀鎖相對(duì)的,我們有了樂(lè)觀鎖。樂(lè)觀鎖一開(kāi)始也說(shuō)了,就是一開(kāi)始假設(shè)不會(huì)造成數(shù)據(jù)沖突,在最后提交的時(shí)候再進(jìn)行數(shù)據(jù)沖突檢測(cè)。在樂(lè)觀鎖中,我們有3種 

          常用的做法來(lái)實(shí)現(xiàn)。 

          [1]第一種就是在數(shù)據(jù)取得的時(shí)候把整個(gè)數(shù)據(jù)都copy到應(yīng)用中,在進(jìn)行提交的時(shí)候比對(duì)當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)和開(kāi)始的時(shí)候更新前取得的數(shù)據(jù)。當(dāng)發(fā)現(xiàn)兩個(gè)數(shù)據(jù)一模一樣以后,就表示沒(méi)有沖突可以提交,否則則是并發(fā)沖突,需要去用業(yè)務(wù)邏輯進(jìn)行解決。 

          [2]第二種樂(lè)觀鎖的做法就是采用版本戳,這個(gè)在Hibernate中得到了使用。采用版本戳的話,首先需要在你有樂(lè)觀鎖的數(shù)據(jù)庫(kù)table上建立一個(gè)新的column,比如為number型,當(dāng)你數(shù)據(jù)每更新一次的時(shí)候,版本數(shù)就會(huì)往上增加1。比如同樣有2個(gè)session同樣對(duì)某條數(shù)據(jù)進(jìn)行操作。兩者都取到當(dāng)前的數(shù)據(jù)的版本號(hào)為1,當(dāng)?shù)谝粋€(gè)session進(jìn)行數(shù)據(jù)更新后,在提交的時(shí)候查看到當(dāng)前數(shù)據(jù)的版本還為1,和自己一開(kāi)始取到的版本相同。就正式提交,然后把版本號(hào)增加1,這個(gè)時(shí)候當(dāng)前數(shù)據(jù)的版本為2。當(dāng)?shù)诙€(gè)session也更新了數(shù)據(jù)提交的時(shí)候,發(fā)現(xiàn)數(shù)據(jù)庫(kù)中版本為2,和一開(kāi)始這個(gè) session取到的版本號(hào)不一致,就知道別人更新過(guò)此條數(shù)據(jù),這個(gè) 

          時(shí)候再進(jìn)行業(yè)務(wù)處理,比如整個(gè)Transaction都Rollback等等操作。在用版本戳的時(shí)候,可以在應(yīng)用程序側(cè)使用版本戳的驗(yàn)證,也可以在數(shù)據(jù)庫(kù)側(cè)采用Trigger(觸發(fā)器)來(lái)進(jìn)行驗(yàn)證。不過(guò)數(shù)據(jù)庫(kù)的Trigger的性能開(kāi)銷還是比較的大,所以能在應(yīng)用側(cè)進(jìn)行驗(yàn)證的話還是推薦不用 Trigger。 

          [3]第三種做法和第二種做法有點(diǎn)類似,就是也新增一個(gè)Table的Column,不過(guò)這次這個(gè)column是采用timestamp型,存儲(chǔ)數(shù)據(jù)最后更新的時(shí)間。在Oracle9i以后可以采用新的數(shù)據(jù)類型,也就是timestamp with time zone類型來(lái)做時(shí)間戳。這種Timestamp的數(shù)據(jù)精度在Oracle的時(shí)間類型中是最高的,精確到微秒(還沒(méi)與到納秒的級(jí)別),一般來(lái)說(shuō),加上數(shù)據(jù)庫(kù)處理時(shí)間和人的思考動(dòng)作時(shí)間,微秒級(jí)別是非常非常夠了,其實(shí)只要精確到毫秒甚至秒都應(yīng)該沒(méi)有什么問(wèn)題。和剛才的版本戳類似,也是在更新提交的時(shí)候檢查當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的時(shí)間戳和自己更新前取到的時(shí)間戳進(jìn)行對(duì)比,如果一致則OK,否則就是版本沖突。如果不想把代碼寫(xiě)在程序中或者由于別的原因無(wú)法把代碼寫(xiě)在現(xiàn)有的程序中,也可以把這個(gè)時(shí)間戳樂(lè)觀鎖邏輯寫(xiě)在Trigger或者存儲(chǔ)過(guò)程中。

          Oracle鎖表(網(wǎng)上抄來(lái)的)

          鎖定類型

                         行級(jí)鎖

                         表級(jí)鎖

          行級(jí)鎖

                   ---- 行被排他鎖定

                   ----在某行的鎖被釋放之前,其他用戶不能修改此行

                   ----使用 commit 或 rollback 命令釋放鎖

                   ----Oracle 通過(guò)使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 語(yǔ)句自動(dòng)獲取行級(jí)鎖

          SELECT…FOR UPDATE 子句

          ―在表的一行或多行上放置排他鎖

          ―用于防止其他用戶更新該行

          ―可以執(zhí)行除更新之外的其他操作

          ―select * from goods where gid=1001

          ―for update of gname;

          ―只有該用戶提交事務(wù),其他用戶才能夠更新gname

          FOR UPDATE WAIT 子句

          ―Oracle9i 中的新增功能

          ―防止無(wú)限期地等待鎖定的行

          ―等待間隔必須指定為數(shù)值文字

          ―等待間隔不能是表達(dá)式、賦值變量或 PL/SQL

          變量

          ―select * from goods where gid=1001 for update of gname wait 3

          ―等待用戶釋放更新鎖的時(shí)間為3秒,否則超時(shí)。

          表級(jí)鎖

          ―保護(hù)表的數(shù)據(jù)

          ―在多個(gè)用戶同時(shí)訪問(wèn)數(shù)據(jù)時(shí)確保數(shù)據(jù)的完整性

          ―可以設(shè)置為三種模式:共享、共享更新和 排他

                    語(yǔ)法:lock table<table_name>in<mode>;

          共享鎖

          ―鎖定表

          ―僅允許其他用戶執(zhí)行查詢操作

          ―不能插入、更新和刪除

          ―多個(gè)用戶可以同時(shí)在同一表中放置此鎖

          ―lock table table_name

          ―in share mode [nowait];

          ― rollback 和commit 命令釋放鎖

          ― nowait 關(guān)鍵字告訴其他用戶不用等待

          共享更新鎖

          ―鎖定要被更新的行

          ―允許其他用戶同時(shí)查詢、插入、更新未被鎖定的行

          ―在 SELECT 語(yǔ)句中使用“FOR UPDATE”子句,可以強(qiáng)制使用共享更新鎖

          ―允許多個(gè)用戶同時(shí)鎖定表的不同行

          加鎖的兩種方法

                  1        lock table tab_name in share update mode;

                  2         select column1,column2

                      from goods

                      where goods

                      where gid=1001

                      for update of column1,column2

          排他鎖

          ―與其他兩種鎖相比,排他鎖是限制性最強(qiáng)的表鎖

          ―僅允許其他用戶查詢數(shù)據(jù)

          ―不允許執(zhí)行插入、刪除和更新操作

          ―在同一時(shí)間僅允許一位用戶在表上放置排他鎖

          ―共享鎖與此相反

                   lock table tab_name in exclusive mode;

                   lock table<表名>[<表名>]...

                             in share mode [nowait]

            

                   lock table< 表名>[<表名>]...

                   in exclusive mode [nowait]

                   lock table<表名>[<表名>]...

                   in share update mode[nowait]

          posted @ 2009-08-18 09:31 久久不醉 閱讀(294) | 評(píng)論 (0)編輯 收藏
           
          Apache POI是Apache軟件基金會(huì)的開(kāi)放源碼函式庫(kù),POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能。
          結(jié)構(gòu):
          HSSF - 提供讀寫(xiě)Microsoft Excel格式檔案的功能。 
          XSSF - 提供讀寫(xiě)Microsoft Excel OOXML格式檔案的功能。 
          HWPF - 提供讀寫(xiě)Microsoft Word格式檔案的功能。 
          HSLF - 提供讀寫(xiě)Microsoft PowerPoint格式檔案的功能。 
          HDGF - 提供讀寫(xiě)Microsoft Visio格式檔案的功能。
          創(chuàng)建Excel 文檔
          示例1將演示如何利用Jakarta POI API 創(chuàng)建Excel 文檔。 
          示例1程序如下:
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFRow;
          import org.apache.poi.hssf.usermodel.HSSFCell;
          import java.io.FileOutputStream;
          public class CreateXL {
          /** Excel 文件要存放的位置,假定在D盤(pán)下*/
          public static String outputFile="D:\\test.xls";
          public static void main(String argv[]){
          try{
          // 創(chuàng)建新的Excel 工作簿
          HSSFWorkbook workbook = new HSSFWorkbook();
          // 在Excel工作簿中建一工作表,其名為缺省值
          // 如要新建一名為"效益指標(biāo)"的工作表,其語(yǔ)句為:
          // HSSFSheet sheet = workbook.createSheet("效益指標(biāo)");
          HSSFSheet sheet = workbook.createSheet();
          // 在索引0的位置創(chuàng)建行(最頂端的行)
          HSSFRow row = sheet.createRow((short)0);
          //在索引0的位置創(chuàng)建單元格(左上端)
          HSSFCell cell = row.createCell((short) 0);
          // 定義單元格為字符串類型
          cell.setCellType(HSSFCell.CELL_TYPE_STRING);
          // 在單元格中輸入一些內(nèi)容
          cell.setCellValue("增加值");
          // 新建一輸出文件流
          FileOutputStream fOut = new FileOutputStream(outputFile);
          // 把相應(yīng)的Excel 工作簿存盤(pán)
          workbook.write(fOut);
          fOut.flush();
          // 操作結(jié)束,關(guān)閉文件
          fOut.close();
          System.out.println("文件生成...");
          }catch(Exception e) {
          System.out.println("已運(yùn)行 xlCreate() : " + e );
          }
          }
          }
          讀取Excel文檔中的數(shù)據(jù)
          示例2將演示如何讀取Excel文檔中的數(shù)據(jù)。假定在D盤(pán)JTest目錄下有一個(gè)文件名為test1.xls的Excel文件。
          示例2程序如下:
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFRow;
          import org.apache.poi.hssf.usermodel.HSSFCell;
          import java.io.FileInputStream;
          public class ReadXL {
          /** Excel文件的存放位置。注意是正斜線*/
          public static String fileToBeRead="D:\\test1.xls";
          public static void main(String argv[]){ 
          try{
          // 創(chuàng)建對(duì)Excel工作簿文件的引用
          HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
          // 創(chuàng)建對(duì)工作表的引用。
          // 本例是按名引用(讓我們假定那張表有著缺省名"Sheet1")
          HSSFSheet sheet = workbook.getSheet("Sheet1");
          // 也可用getSheetAt(int index)按索引引用,
          // 在Excel文檔中,第一張工作表的缺省索引是0,
          // 其語(yǔ)句為:HSSFSheet sheet = workbook.getSheetAt(0);
          // 讀取左上端單元
          HSSFRow row = sheet.getRow(0);
          HSSFCell cell = row.getCell((short)0);
          // 輸出單元內(nèi)容,cell.getStringCellValue()就是取所在單元的值
          System.out.println("左上端單元是: " + cell.getStringCellValue()); 
          }catch(Exception e) {
          System.out.println("已運(yùn)行xlRead() : " + e );
          }
          }
          }
          設(shè)置單元格格式
          在這里,我們將只介紹一些和格式設(shè)置有關(guān)的語(yǔ)句,我們假定workbook就是對(duì)一個(gè)工作簿的引用。在Java中,第一步要做的就是創(chuàng)建和設(shè)置字體和單元格的格式,然后再應(yīng)用這些格式:
          1、創(chuàng)建字體,設(shè)置其為紅色、粗體:
          HSSFFont font = workbook.createFont();
          font.setColor(HSSFFont.COLOR_RED);
          font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
          2、創(chuàng)建格式
          HSSFCellStyle cellStyle= workbook.createCellStyle();
          cellStyle.setFont(font);
          3、應(yīng)用格式 
          HSSFCell cell = row.createCell((short) 0);
          cell.setCellStyle(cellStyle);
          cell.setCellType(HSSFCell.CELL_TYPE_STRING);
          cell.setCellValue("標(biāo)題 "); 
          處理WORD文檔
          import java.io.*; 
          import org.textmining.text.extraction.WordExtractor;
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFRow;
          import org.apache.poi.hssf.usermodel.HSSFCell;
          public class TestPoi { 
          public TestPoi() { 

          public static void main(String args[]) throws Exception 

          FileInputStream in = new FileInputStream ("D:\\a.doc"); 
          WordExtractor extractor = new WordExtractor(); 
          String str = extractor.extractText(in); 
          //System.out.println("the result length is"+str.length()); 
          System.out.println(str); 

          }

          posted @ 2009-08-14 16:06 久久不醉 閱讀(178) | 評(píng)論 (0)編輯 收藏
           
          1. 參數(shù)文件(parameter file, *.ora)
          兩種類型pfile和spfile,推薦使用spfile,pfile是字符型文件可以使用編輯器編輯,spfile是二進(jìn)制文件,要使用set parameter參數(shù)進(jìn)行修改。 使用set parameter進(jìn)行參數(shù)修改時(shí)可以增加注釋,指定修改的作用范圍(memory,spfile,或者both),其中both是默認(rèn)值;使用reset parameter修改原來(lái)的參數(shù)設(shè)置,其中sid選項(xiàng)必選。
          spfile和pfile可以互相生成,啟動(dòng)數(shù)據(jù)庫(kù)時(shí)默認(rèn)使用spfile,要使用pfile需要使用pfile='pfilename'進(jìn)行指定; spfile保存在服務(wù)器,pfile保存在客戶端,使用alter system改變的系統(tǒng)配置寫(xiě)入spfile,不寫(xiě)入pfile。

          2. 調(diào)試文件(trace file, * .trc)
          兩種類型,一種是對(duì)調(diào)試應(yīng)用有關(guān)系的文件,比如打開(kāi)sql調(diào)試選項(xiàng),就會(huì)在這些調(diào)試文件中增加信息;一種是內(nèi)核產(chǎn)生錯(cuò)誤時(shí)產(chǎn)生的調(diào)試文件,供orace支持人員使用。
          我們使用的調(diào)試文件有兩個(gè)存放位置,對(duì)于專屬服務(wù)器存放在udump文件夾下,具體可見(jiàn)user_dump_dest參數(shù);共享服務(wù)器的調(diào)試文件一般存放在bdump文件夾下,具體可見(jiàn)background_dump_dest參數(shù)。
          從v$process, v$session, v$parameter, v$instance做關(guān)聯(lián)查詢可以知道目前session的trace文件。
          可以設(shè)置參數(shù)tracefile_identifier為當(dāng)前session的trace文件增加tag。

          3. 數(shù)據(jù)文件(data file)
          oracle支持的四種文件系統(tǒng):os file system, raw partitions,automatic storage management,clustered file system;
          段(segment),oracle中的每個(gè)對(duì)象都存儲(chǔ)在一個(gè)segment之中,在創(chuàng)建對(duì)象的同時(shí)oracle自動(dòng)創(chuàng)建不同的segment,每個(gè)段由一個(gè)或者多個(gè)簇(extents)組成;
          簇(extent),extent是一個(gè)文件內(nèi)邏輯上連續(xù)的存儲(chǔ)空間,同一個(gè)segment內(nèi)的extent可以屬于不同的文件,最大空間為2G;
          塊(block),塊是oracle中最小的存儲(chǔ)空間,是實(shí)際存儲(chǔ)數(shù)據(jù)對(duì)象的地方;extent由block構(gòu)成;一般取值為2k/4k/8k/16k,在有些條件下也可以使用32k。
          表空間(tablespace),由segment構(gòu)成,一個(gè)segment不能跨越表空間。

          4. 臨時(shí)文件(temp files)
          臨時(shí)文件用于存放中間結(jié)果,它的顯著特征是一般情況下,對(duì)數(shù)據(jù)對(duì)象的操作不產(chǎn)生回滾段,除非顯式指定回滾要求。

          5. 控制文件(control files)
          控制文件是個(gè)小文件,最大64M;在參數(shù)文件中指明控制文件的位置;控制文件指明數(shù)據(jù)文件和在線重做日志文件的位置;控制文件記錄發(fā)生過(guò)的檢查點(diǎn),數(shù)據(jù)庫(kù)名字,創(chuàng)建數(shù)據(jù)庫(kù)時(shí)的時(shí)間戳,歸檔日志的歷史等;
          控制文件應(yīng)該在不同的磁盤(pán)上進(jìn)行備份。

          6. 日志文件(log files)
          一般用于數(shù)據(jù)庫(kù)恢復(fù),也可用于系統(tǒng)崩潰時(shí)的例程恢復(fù),分為在線日志(online log file)和歸檔日志(archived log file).
          online redo log:
          有兩組或者多組在線重做日志,組內(nèi)的每一個(gè)成員互為影射,組之間循環(huán)使用.
          在線重做日志組間的切換稱為log switch,這個(gè)時(shí)候如果數(shù)據(jù)庫(kù)配置不好容易發(fā)生服務(wù)暫停的情況,因?yàn)閿?shù)據(jù)庫(kù)在切換日志組之前要確認(rèn)該日志組已經(jīng)沒(méi)有臟數(shù)據(jù),如果有臟數(shù)據(jù)就要先寫(xiě)入磁盤(pán)中,再進(jìn)行切換。
          oracle在修改數(shù)據(jù)后,會(huì)先寫(xiě)入SGA的對(duì)應(yīng)區(qū)域,當(dāng)commit的時(shí)候?qū)懭朐诰€日志文件,在check point或者重新啟動(dòng)時(shí)由DBWn將修改寫(xiě)入磁盤(pán)。
          設(shè)置online redo log的大小時(shí)要考慮:峰值的時(shí)候產(chǎn)生的日志規(guī)模;修改相同block的用戶數(shù)量;對(duì)數(shù)據(jù)庫(kù)恢復(fù)是否有時(shí)間要求。
          archived redo log:
          數(shù)據(jù)庫(kù)在日志的處理分為兩種類型:archivelog mode,在發(fā)生log switch時(shí)保存原來(lái)日志;noarchivelog,不保存原有日志,直接重用。
          生產(chǎn)環(huán)境中要使用archivelog mode,保證數(shù)據(jù)不丟失。

          7. 口令文件(password file)
          可選文件,為遠(yuǎn)程啟動(dòng)oracle提供驗(yàn)證。

          8. DMP文件(exp/imp files)
          dmp文件用于oracle的導(dǎo)入導(dǎo)出,它和平臺(tái)無(wú)關(guān);是二進(jìn)制文件;通過(guò)網(wǎng)絡(luò)傳輸時(shí)要確保以二進(jìn)制的格式進(jìn)行傳輸,否則可能導(dǎo)致文件被轉(zhuǎn)換;導(dǎo)入時(shí)向下兼容即新版本的oracle可導(dǎo)入老版本的dmp文件。
          posted @ 2009-06-08 16:36 久久不醉 閱讀(243) | 評(píng)論 (0)編輯 收藏
           
          設(shè)立封鎖機(jī)制主要是為了對(duì)并發(fā)操作進(jìn)行控制,對(duì)干擾進(jìn)行封鎖,保證數(shù)據(jù)的一致性和準(zhǔn)確性。Oracle數(shù)據(jù)庫(kù)封鎖方式有三種:共享封鎖,獨(dú)占封鎖,共享更新封鎖 
          [b:8f4f63b9bb]封鎖類型[/b:8f4f63b9bb] 
          Oracle RDBMS的封鎖類型可分為如下三類: 

          1、內(nèi)部級(jí)封鎖 
          內(nèi)部級(jí)封鎖是用于保護(hù)ORACLE內(nèi)部結(jié)構(gòu),由系統(tǒng)內(nèi)部實(shí)現(xiàn),用戶不能訪問(wèn),因此我們不必對(duì)此做過(guò)多的了解。 

          2、DDL級(jí)封鎖(字典/語(yǔ)法分析封鎖) 
          DDL級(jí)封鎖也是由ORACLE RDBMS來(lái)控制,它用于保護(hù)數(shù)據(jù)字典和數(shù)據(jù)定義改變時(shí)的一致性和完整性。它是系統(tǒng)在對(duì)SQL定義語(yǔ)句作語(yǔ)法分析時(shí)自動(dòng)地加鎖,無(wú)需用戶干予。字典/語(yǔ)法分析封鎖共分三類: 
          (1)、字典操作鎖:用于對(duì)字典操作時(shí),鎖住數(shù)據(jù)字典,此封鎖是獨(dú)占的,從而保護(hù)任何一個(gè)時(shí)刻僅能對(duì)一個(gè)字典操作。 
          (2)、字典定義鎖:用于防止在進(jìn)行字典操作時(shí)又進(jìn)行語(yǔ)法分析,這樣可以避免在查詢字典的同時(shí)改動(dòng)某個(gè)表的結(jié)構(gòu)。 
          (3)、表定義鎖:用于 一個(gè)SQL語(yǔ)句正當(dāng)訪問(wèn)某個(gè)表時(shí),防止字典中與該表有關(guān)的項(xiàng)目被修改。 

          3、DML級(jí)封鎖 
          DML級(jí)封鎖用于控制并發(fā)事務(wù)中的數(shù)據(jù)操縱,保證數(shù)據(jù)的一致性和完整性,其封鎖對(duì)象可以是表或行。 
          對(duì)用戶的數(shù)據(jù)操縱,Oracle可以自動(dòng)為操縱的數(shù)據(jù)進(jìn)行封鎖,但如果有操縱授權(quán),則為滿足并發(fā)操縱的需要另外實(shí)施封鎖。DML封鎖可由一個(gè)用戶進(jìn)程以顯式的方式加鎖,也可通過(guò)某些   SQL語(yǔ)句隱含方式實(shí)現(xiàn)。 
          DML鎖有如下三種封鎖方式: 
          (1)、共享封鎖方式(SHARE) 
          (2)、獨(dú)占封鎖方式(EXCLUSIVE) 
          (3)、共享更新封鎖(SHARE UPDATE) 

          其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 
          1、共享方式的表封鎖 
          共享方式的表封鎖是對(duì)表中的所有數(shù)據(jù)進(jìn)行封鎖,該鎖用于保護(hù)查詢數(shù)據(jù)的一致性,防止其它用戶對(duì)已封鎖的表進(jìn)行更更新。其它用戶只能對(duì)該表再施加共享方式的鎖,而不能再對(duì)該表施加獨(dú)占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進(jìn)程做更新。共享該表的所有用戶只能查詢表中的數(shù)據(jù),但不能更新。共享方式的表封鎖只能由用戶用SQL語(yǔ)句來(lái)設(shè)置,基語(yǔ)句格式如下: 
          [quote:04b72348bd]LOCK TABLE <表名>[,<表名>]... 
          IN SHARE MODE [NOWAIT] 
          [/quote:04b72348bd] 
          執(zhí)行該語(yǔ)句,對(duì)一個(gè)或多個(gè)表施加共享方式的表封鎖。當(dāng)指定了選擇項(xiàng)NOWAIT,若該封鎖暫時(shí)不能施加成功,則返回并由用戶決定是進(jìn)行等待,還是先去執(zhí)行別的語(yǔ)句。 
          持有共享鎖的事務(wù),在出現(xiàn)如下之一的條件時(shí),便釋放其共享鎖: 
          A、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 
          B、退出數(shù)據(jù)庫(kù)(LOG OFF)。 
          C、程序停止運(yùn)行。 
          共享方式表封鎖常用于一致性查詢過(guò)程,即在查詢數(shù)據(jù)期間表中的數(shù)據(jù)不發(fā)生改變。 

          2、獨(dú)占方式表封鎖 
          獨(dú)占方式表封鎖是用于封鎖表中的所有數(shù)據(jù),擁有該獨(dú)占方式表封鎖的用戶,即可以查詢?cè)摫恚挚梢愿略摫恚渌挠脩舨荒茉賹?duì)該表施加任何封鎖(包括共享、獨(dú)占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢?cè)摫怼?nbsp;
          獨(dú)占方式的表封鎖可通過(guò)如下的SQL語(yǔ)句來(lái)顯示地獲得: 
          LOCK TABLE <表名>[,<表名>].... 
          IN EXCLUSIVE MODE [NOWAIT] 
          獨(dú)占方式的表封鎖也可以在用戶執(zhí)行DML語(yǔ)句INSERT、UPDATE、DELETE時(shí)隱含獲得。 
          擁有獨(dú)占方式表封鎖的事務(wù),在出現(xiàn)如下條件之一時(shí),便釋放該封鎖: 
          (1)、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 
          (2)、退出數(shù)據(jù)庫(kù)(LOG OFF) 
          (3)、程序停止運(yùn)行。 
          獨(dú)占方式封鎖通常用于更新數(shù)據(jù),當(dāng)某個(gè)更新事務(wù)涉及多個(gè)表時(shí),可減少發(fā)生死鎖。 

          DML鎖有如下三種封鎖方式: 
          (1)、共享封鎖方式(SHARE) 
          (2)、獨(dú)占封鎖方式(EXCLUSIVE) 
          (3)、共享更新封鎖(SHARE UPDATE) 
          其中SHARE,EXCLUSIVE用于表封鎖,SHARE UPDATE用于行封鎖。 

          1、共享方式的表封鎖 
          共享方式的表封鎖是對(duì)表中的所有數(shù)據(jù)進(jìn)行封鎖,該鎖用于保護(hù)查詢數(shù)據(jù)的一致性,防止其它用戶對(duì)已封鎖的表進(jìn)行更更新。其它用戶只能對(duì)該表再施加共享方式的鎖,而不能再對(duì)該表施加獨(dú)占方式的封鎖,共享更新鎖可以再施加,但不允許持有共享更新封鎖的進(jìn)程做更新。共享該表的所有用戶只能查詢表中的數(shù)據(jù),但不能更新。共享方式的表封鎖只能由用戶用SQL語(yǔ)句來(lái)設(shè)置,基語(yǔ)句格式如下: 
          [quote:04b72348bd]LOCK TABLE <表名>[,<表名>]... 
          IN SHARE MODE [NOWAIT] 
          [/quote:04b72348bd] 
          執(zhí)行該語(yǔ)句,對(duì)一個(gè)或多個(gè)表施加共享方式的表封鎖。當(dāng)指定了選擇項(xiàng)NOWAIT,若該封鎖暫時(shí)不能施加成功,則返回并由用戶決定是進(jìn)行等待,還是先去執(zhí)行別的語(yǔ)句。 
          持有共享鎖的事務(wù),在出現(xiàn)如下之一的條件時(shí),便釋放其共享鎖: 
          A、執(zhí)行COMMIT或ROLLBACK語(yǔ)句。 
          B、退出數(shù)據(jù)庫(kù)(LOG OFF)。 
          C、程序停止運(yùn)行。 
          共享方式表封鎖常用于一致性查詢過(guò)程,即在查詢數(shù)據(jù)期間表中的數(shù)據(jù)不發(fā)生改變。 

          2、獨(dú)占方式表封鎖 
          獨(dú)占方式表封鎖是用于封鎖表中的所有數(shù)據(jù),擁有該獨(dú)占方式表封鎖的用戶,即可以查詢?cè)摫恚挚梢愿略摫恚渌挠脩舨荒茉賹?duì)該表施加任何封鎖(包括共享、獨(dú)占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢?cè)摫怼?nbsp;
          獨(dú)占方式的表封鎖可通過(guò)如下的SQL語(yǔ)句來(lái)顯示地獲得: 
          LOCK TABLE <表名>[,<表名>].... 
          IN EXCLUSIVE MODE [NOWAIT] 
          獨(dú)占方式的表封鎖也可以在用戶執(zhí)行DML語(yǔ)句INSERT、UPDATE、DELETE時(shí)隱含獲得。 
          擁有獨(dú)占方式表封鎖的事務(wù),在出現(xiàn)如下條件之一時(shí),便釋放該封鎖: <BR>(1)、執(zhí)行   COMMIT或ROLLBACK語(yǔ)句。 
          (2)、退出數(shù)據(jù)庫(kù)(LOG OFF) 
          (3)、程序停止運(yùn)行。 
          獨(dú)占方式封鎖通常用于更新數(shù)據(jù),當(dāng)某個(gè)更新事務(wù)涉及多個(gè)表時(shí),可減少發(fā)生死鎖。 

          3、共享更新封鎖方式 
          共享更新封鎖是對(duì)一個(gè)表的一行或多行進(jìn)行封鎖,因而也稱作行級(jí)封鎖。表級(jí)封鎖雖然保證了數(shù)據(jù)的一致性,但卻減弱了操作數(shù)據(jù)的并行性。行級(jí)封鎖確保在用戶取得被更新的行到該行進(jìn)行更新這段時(shí)間內(nèi)不被其它用戶所修改。因而行級(jí)鎖即可保證數(shù)據(jù)的一致性又能提高數(shù)據(jù)操作的迸發(fā)性。 
          可通過(guò)如下的兩種方式來(lái)獲得行級(jí)封鎖: 
          (1)、執(zhí)行如下的SQL封鎖語(yǔ)句,以顯示的方式獲得: 
          LOCK TABLE <表名>[,<表名>].... 
          IN SHARE UPDATE MODE [NOWAIT] 
          (2)、用如下的SELECT ...FOR UPDATE語(yǔ)句獲得: 
          SELECT <列名>[,<列名>]... 
          FROM <表名> 
          WHERE <條件> 
          FOR UPDATE OF <列名>[,<列名>].....[NOWAIT] 
          一旦用戶對(duì)某個(gè)行施加了行級(jí)封鎖,則該用戶可以查詢也可以更新被封鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被封鎖的數(shù)據(jù)行.如果其它用戶想更新該表中的數(shù)據(jù)行,則也必須對(duì)該表施加行級(jí)鎖.即使多個(gè)用戶對(duì)一個(gè)表均使用了共享更新,但也不允許兩個(gè)事務(wù)同時(shí)對(duì)一個(gè)表進(jìn)行更新,真正對(duì)表進(jìn)行更新時(shí),是以獨(dú)占方式封鎖表,一直到提交或復(fù)原該事務(wù)為止。行鎖永遠(yuǎn)是獨(dú)占方式鎖。 
          當(dāng)出現(xiàn)如下之一的條件,便釋放共享更新鎖: 
          (1)、執(zhí)行提交(COMMIT)語(yǔ)句; 
          (2)、退出數(shù)據(jù)庫(kù)(LOG OFF) 
          (3)、程序停止運(yùn)行。 
          執(zhí)行ROLLBACK操作不能釋放行鎖。 
          從上面講述可見(jiàn),ORACLE RDBMS的加鎖機(jī)制,解決了并發(fā)事務(wù)的相容與互斥問(wèn)題。相容保證事務(wù)的并發(fā)性,互斥確保數(shù)據(jù)的一致性。不同用戶鎖的相容與互斥關(guān)系由下圖給出。 

          其中最后一行最后一列為其它用戶提供在不同行上設(shè)置SHARE UPDATE鎖。但當(dāng)用戶1在某行上進(jìn)行更新操作時(shí),用戶2只有等待用戶1提交事務(wù)后,才能更新自己所封鎖的行。 

          中最后一行最后一列為其它用戶提供在不同行上設(shè)置SHARE UPDATE鎖。但當(dāng)用戶1在某行上進(jìn)行更新操作時(shí),用戶2只有等待用戶1提交事務(wù)后,才能更新自己所封鎖的行。 
          死鎖 

          封鎖雖然能夠有效的解決并發(fā)操作,但是任何資源的獨(dú)占都會(huì)有死鎖的危險(xiǎn)。例如:有兩個(gè)事務(wù)T1,T2,T1對(duì)數(shù)據(jù)A施加獨(dú)占封鎖,T2對(duì)數(shù)據(jù)B施加了獨(dú)占封鎖。再假設(shè)T1要對(duì)數(shù)據(jù)B加鎖,由于B已被T2獨(dú)占封鎖,因此T1置于等待狀態(tài),等待B被釋放;現(xiàn)在若T2也要對(duì)A進(jìn)行封鎖,由于A已被T1獨(dú)占封鎖,因此T2也被置于等待狀態(tài)。這樣就形成了兩個(gè)事務(wù)相互等待的狀態(tài),而且永遠(yuǎn)不能結(jié)束,此種情況稱為死鎖。 
          在Oracle系統(tǒng)中能自動(dòng)發(fā)現(xiàn)死鎖,并選擇代價(jià)最小的,即完成工作量最少的事務(wù)予以撤消,釋放該事務(wù)所擁有的全部鎖,記其它的事務(wù)繼續(xù)工作下去。 
          從系統(tǒng)性能上考慮,應(yīng)該盡可能減少資源競(jìng)爭(zhēng),增大吞吐量,因此用戶在給并發(fā)操作加鎖時(shí),應(yīng)注意以下幾點(diǎn): 
          1、對(duì)于UPDATE和DELETE操作,應(yīng)只封鎖要做改動(dòng)的行,在完成修改后立即提交。 
          2、當(dāng)多個(gè)事務(wù)正利用共享更新的方式進(jìn)行更新,則不要使用共享封鎖,而應(yīng)采用共享更新封鎖,這樣其它用戶就能使用行級(jí)鎖,以增加并行性。 
          3、盡可能將對(duì)一個(gè)表的操作的并發(fā)事務(wù)施加共享更新鎖,從而可提高并行性。 
          4、在應(yīng)用負(fù)荷較高的期間,不宜對(duì)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)(表、索引、簇和視圖)進(jìn)行修改
          posted @ 2009-06-02 16:08 久久不醉 閱讀(127) | 評(píng)論 (0)編輯 收藏
          CALENDER
          <2009年6月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          留言簿

          隨筆檔案(54)

          文章分類

          搜索

          •  

          最新評(píng)論


          Powered By: 博客園
          模板提供滬江博客

          主站蜘蛛池模板: 绥江县| 当涂县| 铁岭市| 青海省| 苍南县| 惠安县| 元江| 淮安市| 浪卡子县| 沾化县| 陆川县| 车险| 乐清市| 江山市| 吉安市| 五指山市| 沙洋县| 永善县| 临朐县| 凤台县| 南涧| 乐东| 景泰县| 武强县| 吉木萨尔县| 台安县| 涞源县| 柏乡县| 剑川县| 新安县| 抚宁县| 彩票| 吉安县| 巴中市| 昌平区| 公主岭市| 石屏县| 藁城市| 昌邑市| 巩义市| 丹江口市|