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

          2009年9月2日

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

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

           DBCP數(shù)據(jù)源
              DBCP類包位于 <spring_home></spring_home>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴 Jakarta commons-pool對象池機制的數(shù)據(jù)庫連接池,所以在類路徑下還必須包括<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ù)據(jù)源能夠正常關(guān)閉。除以上必須的數(shù)據(jù)源屬性外,還有一些常用的屬性:
              defaultAutoCommit:設(shè)置從數(shù)據(jù)源中返回的連接是否采用自動提交機制,默認值為 true;
              defaultReadOnly:設(shè)置數(shù)據(jù)源是否僅能執(zhí)行只讀操作, 默認值為 false;
              maxActive:最大連接數(shù)據(jù)庫連接數(shù),設(shè)置為0時,表示沒有限制;
              maxIdle:最大等待連接中的數(shù)量,設(shè)置為0時,表示沒有限制;
              maxWait:最大等待秒數(shù),單位為毫秒, 超過時間會報出錯誤信息;
              validationQuery:用于驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數(shù)據(jù), 如你可以簡單地設(shè)置為:“select count(*) from user”;
              removeAbandoned:是否自我中斷,默認是 false ;
              removeAbandonedTimeout:幾秒后數(shù)據(jù)連接會自動斷開,在removeAbandoned為true,提供該值;
              logAbandoned:是否記錄中斷事件, 默認為 false;

          C3P0數(shù)據(jù)源
              C3P0是一個開放源代碼的JDBC數(shù)據(jù)源實現(xiàn)項目,它在lib目錄中與Hibernate一起發(fā)布,實現(xiàn)了JDBC3和JDBC2擴展規(guī)范說明的 Connection 和Statement 池。C3P0類包位于<spring_home></spring_home>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個 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一樣提供了一個用于關(guān)閉數(shù)據(jù)源的close()方法,這樣我們就可以保證Spring容器關(guān)閉時數(shù)據(jù)源能夠成功釋放。
              C3P0擁有比DBCP更豐富的配置屬性,通過這些屬性,可以對數(shù)據(jù)源進行各種有效的控制:
              acquireIncrement:當連接池中的連接用完時,C3P0一次性創(chuàng)建新連接的數(shù)目;
              acquireRetryAttempts:定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試獲取的次數(shù),默認為30;
              acquireRetryDelay:兩次連接中間隔時間,單位毫秒,默認為1000;
              autoCommitOnClose:連接關(guān)閉時默認將所有未提交的操作回滾。默認為false;
              automaticTestTable: C3P0將建一張名為Test的空表,并使用其自帶的查詢語句進行測試。如果定義了這個參數(shù),那么屬性preferredTestQuery將被忽略。你 不能在這張Test表上進行任何操作,它將中為C3P0測試所用,默認為null;
              breakAfterAcquireFailure:獲取連接失敗將會引起所有等待獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)   用getConnection()的時候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。默認為 false;
              checkoutTimeout:當連接池用完時客戶端調(diào)用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設(shè)為0則無限期等待。單位毫秒,默認為0;
              connectionTesterClassName: 通過實現(xiàn)ConnectionTester或QueryConnectionTester的類來測試連接,類名需設(shè)置為全限定名。默認為 com.mchange.v2.C3P0.impl.DefaultConnectionTester; 
              idleConnectionTestPeriod:隔多少秒檢查所有連接池中的空閑連接,默認為0表示不檢查;
              initialPoolSize:初始化時創(chuàng)建的連接數(shù),應(yīng)在minPoolSize與maxPoolSize之間取值。默認為3;
              maxIdleTime:最大空閑時間,超過空閑時間的連接將被丟棄。為0或負數(shù)則永不丟棄。默認為0;
              maxPoolSize:連接池中保留的最大連接數(shù)。默認為15;
              maxStatements:JDBC的標準參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatement數(shù)量。但由于預(yù)緩存的Statement屬 于單個Connection而不是整個連接池。所以設(shè)置這個參數(shù)需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均為0,則緩存被關(guān)閉。默認為0;
              maxStatementsPerConnection:連接池內(nèi)單個連接所擁有的最大緩存Statement數(shù)。默認為0;
              numHelperThreads:C3P0是異步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能,通過多線程實現(xiàn)多個操作同時被執(zhí)行。默認為3;
              preferredTestQuery:定義所有連接測試都執(zhí)行的測試語句。在使用連接測試的情況下這個參數(shù)能顯著提高測試速度。測試的表必須在初始數(shù)據(jù)源的時候就存在。默認為null;
              propertyCycle: 用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待的秒數(shù)。默認為300;
              testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設(shè)為true那么在每個connection提交的時候都 將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
          等方法來提升連接測試的性能。默認為false;
              testConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時將校驗連接的有效性。默認為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)常有開發(fā)者在${xxx}的前后不小心鍵入一些空格,這些空格字符將和變量合并后作為屬性的值。如: <property name="username" value=" ${jdbc.username} "></property> 的屬性配置項,在前后都有空格,被解析后,username的值為“ 1234 ”,這將造成最終的錯誤,因此需要特別小心。

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

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

          通過jndiName指定引用的JNDI數(shù)據(jù)源名稱。
              Spring 2.0為獲取J2EE資源提供了一個jee命名空間,通過jee命名空間,可以有效地簡化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ù)源實現(xiàn)類
              Spring本身也提供了一個簡單的數(shù)據(jù)源實現(xiàn)類DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。這個類實現(xiàn)了javax.sql.DataSource接口,但 它并沒有提供池化連接的機制,每次調(diào)用getConnection()獲取新連接時,只是簡單地創(chuàng)建一個新的連接。因此,這個數(shù)據(jù)源類比較適合在單元測試 或簡單的獨立應(yīng)用中使用,因為它不需要額外的依賴類。
               下面,我們來看一下DriverManagerDataSource的簡單使用:
          當然,我們也可以通過配置的方式直接使用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附帶了兩個數(shù)據(jù)源的實現(xiàn)類包,你可以自行選擇進行定義。在實際部署時,我們可能會直接采用應(yīng)用服 務(wù)器本身提供的數(shù)據(jù)源,這時,則可以通過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) | 評論 (0)編輯 收藏
           

          oracle xe universal默認創(chuàng)建AL32UTF8字符集,這種字符集1個漢字占用3個字節(jié),而
          ZHS16GBK字符集1個漢字占用2個字節(jié),為了節(jié)約空間,我嘗試改變數(shù)據(jù)庫的字符集,
          但是失敗了,因為新字符集不是舊字符集的超集。即使用restrict模式也不行。
          考慮到oracle xe 安裝時只是建一個空庫,僅包含系統(tǒng)表空間等,設(shè)想通過手工執(zhí)行
          創(chuàng)建ZHS16GBK字符集數(shù)據(jù)庫的辦法實現(xiàn)。
          從sybex的10g ocp教材中復(fù)制并修改得下面語句,其中E:\ORADATA\TEST是我們要存放
          新數(shù)據(jù)庫物理文件的目錄,以和舊數(shù)據(jù)庫區(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í)行這個腳本以前,有3點要注意:
          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ù)庫F:\oraclexe\app\oracle\admin\XE復(fù)制得到。

          2 要去掉EXTENT MANAGEMENT LOCAL語句否則執(zhí)行出錯。(沒有找出原因)

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

          3 test.ora中的db_name不能改變,否則執(zhí)行出錯。(沒有找出原因)
          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ù)正在啟動 .........
          OracleServiceXE 服務(wù)已經(jī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 行。

          我們可以看到,當前AL32UTF8字符集1個漢字占用3個字節(jié)
          4 關(guān)閉數(shù)據(jù)庫,但不停止服務(wù)
          QL> shutdown immediate
          數(shù)據(jù)庫已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫。
          ORACLE 例程已經(jīng)關(guān)閉。
          5 用修改過的pfile test.ora啟動數(shù)據(jù)庫(nomount)
          SQL> startup nomount pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
          ORACLE 例程已經(jī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ù)庫腳本
          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ù)庫已創(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ù)庫,但不停止服務(wù)
          SQL> shutdown immediate
          數(shù)據(jù)庫已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫。
          ORACLE 例程已經(jīng)關(guān)閉。
          9 用修改過的pfile test.ora啟動數(shù)據(jù)庫
          SQL> startup  pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
          ORACLE 例程已經(jī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ù)庫裝載完畢。
          數(shù)據(jù)庫已經(jīng)打開。
          10 查看新建數(shù)據(jù)庫的字符集設(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 行。
          可見我們新的數(shù)據(jù)庫的確是ZHS16GBK字符集,1個漢字占用2個字節(jié)
          11 要啟動舊數(shù)據(jù)庫(因為新舊數(shù)據(jù)庫同名,而且oracle xe限制同時只能打開一個數(shù)據(jù)庫)
          SQL> shutdown immediate
          數(shù)據(jù)庫已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫。
          ORACLE 例程已經(jīng)關(guān)閉。
          SQL> startup
          ORACLE 例程已經(jī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ù)庫裝載完畢。
          數(shù)據(jù)庫已經(jīng)打開。

          ----

          如果以后要用spfile自動新建數(shù)據(jù)庫
          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ù)庫已經(jīng)關(guān)閉。
          已經(jīng)卸載數(shù)據(jù)庫。
          ORACLE 例程已經(jīng)關(guān)閉。
          SQL> startup
          ORACLE 例程已經(jī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ù)庫裝載完畢。
          數(shù)據(jù)庫已經(jīng)打開。
          SQL> select lengthb('擇') from dual;

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

          已選擇 1 行。

          遠程登錄,客戶端也需要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]
          的問題也算得到了解決

           

          本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/l1t/archive/2006/05/31/765125.aspx

          posted @ 2009-12-28 15:17 久久不醉 閱讀(629) | 評論 (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';//表空間對應(yīng)的數(shù)據(jù)文件

             select * from dba_segments
              where tablespace_name='INDEXS';
            3、數(shù)據(jù)庫對象:
             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ù)庫鏈:
             select * from dba_db_links;
            在spbase下建數(shù)據(jù)庫鏈
             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;
            存儲過程,函數(shù)從dba_objects查找。
            其文本:select text from user_source where name='BOOK_SP_EXAMPLE';
            建立出錯:select * from user_errors;
            oracle總是將存儲過程,函數(shù)等軟件放在SYSTEM表空間。
            13、約束:
            (1)約束是和表關(guān)聯(lián)的,可在create table或alter table table_name add/drop/modify來建立、修改、刪除約束。
            可以臨時禁止約束,如:
             alter table book_example
             disable constraint book_example_1;
             alter table book_example
             enable constraint book_example_1;
            (2)主鍵和外鍵被稱為表約束,而not null和unique之類的約束被稱為列約束。通常將主鍵和外鍵作為單獨的命名約束放在字段列表下面,而列約束可放在列定義的同一行,這樣更具有可讀性。
            (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)定義約束可以無名(系統(tǒng)自動生成約束名)和自己定義約束名(特別是主鍵、外鍵)
            如:create table book_example
              (identifier number not null);
              create table book_example
              (identifier number constranit book_example_1 not null);
            14、回滾段:
            在所有的修改結(jié)果存入磁盤前,回滾段中保持恢復(fù)該事務(wù)所需的全部信息,必須以數(shù)據(jù)庫發(fā)生的事務(wù)來相應(yīng)確定其大小(DML語句才可回滾,create,drop,truncate等DDL不能回滾)。
            回滾段數(shù)量=并發(fā)事務(wù)/4,但不能超過50;使每個回滾段大小足夠處理一個完整的事務(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)測回滾段的大小和動態(tài)增長。
            回滾段的區(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
            針對bytes可以使用回滾段回縮。
             alter rollback segment rbs_cvt shrink;
             select bytes,extents,max_extents from dba_segments
              where segment_type='ROLLBACK' and segment_name='RBS_CVT';
            回滾段的當前狀態(tài)信息:
             select * from dba_rollback_segs
              where segment_name='RB1';
            比多回滾段狀態(tài)status,回滾段所屬實例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;
            當事務(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è)
             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號作業(yè)。

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

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

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

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

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

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

          7. /*+CLUSTER(TABLE)*/ 
          提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對象有效. 
          例如: 
          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)*/ 
          表明對表選擇索引的掃描方法. 
          例如: 
          SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M'; 

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

          10. /*+INDEX_COMBINE*/ 
          為指定表選擇位圖訪問路經(jīng),如果INDEX_COMBINE中沒有提供作為參數(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)化器使用索引作為訪問路徑. 
          例如: 
          SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE 
          FROM BSEMPMS WHERE SAL<60000; 

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

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

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

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

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

          17. /*+NOWRITE*/ 
          禁止對查詢塊的查詢重寫操作. 

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

          19. /*+MERGE(TABLE)*/ 
          能夠?qū)σ晥D的各個查詢進行相應(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)*/ 
          對于有可合并的視圖不再合并. 
          例如: 
          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)*/ 
          將指定表與嵌套的連接的行源進行連接,并把指定表作為內(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)*/ 
          將指定的表與其他行源通過合并排序連接方式連接起來. 
          例如: 
          SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

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

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

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

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

          28. /*+NOCACHE(TABLE)*/ 
          當進行全表掃描時,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*/ 
          通過在插入語句生存期內(nèi)停止并行模式來啟動常規(guī)插入. 
          insert /*+noappend*/ into test1 select * from test4 ;

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

          總結(jié)如下:

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

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



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

              第一種方式:每個Bean都有一個代理

          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共享一個代理基類

          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標簽配置的攔截器

          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>  

          此時在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) | 評論 (0)編輯 收藏
           
               摘要: 利用xfire編寫webservice的例子,內(nèi)容如下 1. xfire + spring 發(fā)布webservice 2. 利用 javascript  調(diào)用發(fā)布的webservice 使用xfire+spring發(fā)布webservice其實很簡單,遵循一下幾個步驟即可 1. 想要發(fā)布成文webservice的類,必須實現(xiàn)接口 ...  閱讀全文
          posted @ 2009-09-02 16:38 久久不醉 閱讀(3570) | 評論 (3)編輯 收藏
           
          xfire+spring 實踐記錄(一) 
          客戶端代碼: 
          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) | 評論 (0)編輯 收藏
          CALENDER
          <2009年9月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          留言簿

          隨筆檔案(54)

          文章分類

          搜索

          •  

          最新評論


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

          主站蜘蛛池模板: 天长市| 澜沧| 南昌市| 玉环县| 邮箱| 北流市| 山东| 县级市| 运城市| 阳高县| 咸丰县| 纳雍县| 旬邑县| 曲阳县| 运城市| 梨树县| 鄂伦春自治旗| 和平区| 民勤县| 安国市| 红桥区| 梓潼县| 宿松县| 大宁县| 墨竹工卡县| 延津县| 石柱| 宁远县| 霍林郭勒市| 大田县| 黎平县| 晋江市| 榆中县| 长宁区| 和静县| 哈巴河县| 宣城市| 浦城县| 瑞昌市| 淮南市| 桃源县|