<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆:-4 文章:58 評論:4 引用:0
    首頁 發新隨筆
    發新文章 聯系 聚合管理

    2009年2月4日

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

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

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

    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()方法關閉數據源,所以必須設定destroy-method=”close”屬性, 以便Spring容器關閉時,數據源能夠正常關閉。除以上必須的數據源屬性外,還有一些常用的屬性:
        defaultAutoCommit:設置從數據源中返回的連接是否采用自動提交機制,默認值為 true;
        defaultReadOnly:設置數據源是否僅能執行只讀操作, 默認值為 false;
        maxActive:最大連接數據庫連接數,設置為0時,表示沒有限制;
        maxIdle:最大等待連接中的數量,設置為0時,表示沒有限制;
        maxWait:最大等待秒數,單位為毫秒, 超過時間會報出錯誤信息;
        validationQuery:用于驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數據, 如你可以簡單地設置為:“select count(*) from user”;
        removeAbandoned:是否自我中斷,默認是 false ;
        removeAbandonedTimeout:幾秒后數據連接會自動斷開,在removeAbandoned為true,提供該值;
        logAbandoned:是否記錄中斷事件, 默認為 false;

    C3P0數據源
        C3P0是一個開放源代碼的JDBC數據源實現項目,它在lib目錄中與Hibernate一起發布,實現了JDBC3和JDBC2擴展規范說明的 Connection 和Statement 池。C3P0類包位于<spring_home></spring_home>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個 Oracle數據源:

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

     獲取JNDI數據源
        如果應用配置在高性能的應用服務器(如WebLogic或Websphere等)上,我們可能更希望使用應用服務器本身提供的數據源。應用服務器的數據源 使用JNDI開放調用者使用,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數據源名稱。
        Spring 2.0為獲取J2EE資源提供了一個jee命名空間,通過jee命名空間,可以有效地簡化J2EE資源的引用。下面是使用jee命名空間引用JNDI數據源的配置:

    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的數據源實現類
        Spring本身也提供了一個簡單的數據源實現類DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。這個類實現了javax.sql.DataSource接口,但 它并沒有提供池化連接的機制,每次調用getConnection()獲取新連接時,只是簡單地創建一個新的連接。因此,這個數據源類比較適合在單元測試 或簡單的獨立應用中使用,因為它不需要額外的依賴類。
         下面,我們來看一下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();  

     

    小結

        不管采用何種持久化技術,都需要定義數據源。Spring附帶了兩個數據源的實現類包,你可以自行選擇進行定義。在實際部署時,我們可能會直接采用應用服 務器本身提供的數據源,這時,則可以通過JndiObjectFactoryBean或jee命名空間引用JNDI中的數據源。

    DBCP與C3PO配置的區別:

    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 久久不醉 閱讀(193) | 評論 (0)編輯 收藏
     

    oracle xe universal默認創建AL32UTF8字符集,這種字符集1個漢字占用3個字節,而
    ZHS16GBK字符集1個漢字占用2個字節,為了節約空間,我嘗試改變數據庫的字符集,
    但是失敗了,因為新字符集不是舊字符集的超集。即使用restrict模式也不行。
    考慮到oracle xe 安裝時只是建一個空庫,僅包含系統表空間等,設想通過手工執行
    創建ZHS16GBK字符集數據庫的辦法實現。
    從sybex的10g ocp教材中復制并修改得下面語句,其中E:\ORADATA\TEST是我們要存放
    新數據庫物理文件的目錄,以和舊數據庫區分。


    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
    ;
    在執行這個腳本以前,有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等目錄,這些目錄可以從現有的XE數據庫F:\oraclexe\app\oracle\admin\XE復制得到。

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

    CREATE DATABASE XE
    *
    第 1 行出現錯誤:
    ORA-25146: EXTENT MANAGEMENT ?????

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

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

    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 查看現有的字符集設置
    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個字節
    4 關閉數據庫,但不停止服務
    QL> shutdown immediate
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。
    5 用修改過的pfile test.ora啟動數據庫(nomount)
    SQL> startup nomount pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
    ORACLE 例程已經啟動。

    Total System Global Area  285212672 bytes
    Fixed Size                  1287016 bytes
    Variable Size              92277912 bytes
    Database Buffers          188743680 bytes
    Redo Buffers                2904064 bytes
    6 執行建立數據庫腳本
    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  ;

    數據庫已創建。
    7 執行創建數據字典和程序包的系統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 關閉數據庫,但不停止服務
    SQL> shutdown immediate
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。
    9 用修改過的pfile test.ora啟動數據庫
    SQL> startup  pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
    ORACLE 例程已經啟動。

    Total System Global Area  285212672 bytes
    Fixed Size                  1287016 bytes
    Variable Size              92277912 bytes
    Database Buffers          188743680 bytes
    Redo Buffers                2904064 bytes
    數據庫裝載完畢。
    數據庫已經打開。
    10 查看新建數據庫的字符集設置
    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 行。
    可見我們新的數據庫的確是ZHS16GBK字符集,1個漢字占用2個字節
    11 要啟動舊數據庫(因為新舊數據庫同名,而且oracle xe限制同時只能打開一個數據庫)
    SQL> shutdown immediate
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。
    SQL> startup
    ORACLE 例程已經啟動。

    Total System Global Area  285212672 bytes
    Fixed Size                  1287016 bytes
    Variable Size              96472216 bytes
    Database Buffers          184549376 bytes
    Redo Buffers                2904064 bytes
    數據庫裝載完畢。
    數據庫已經打開。

    ----

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

    文件已創建。

    SQL> shutdown immediate;
    數據庫已經關閉。
    已經卸載數據庫。
    ORACLE 例程已經關閉。
    SQL> startup
    ORACLE 例程已經啟動。

    Total System Global Area 285212672 bytes
    Fixed Size 1287016 bytes
    Variable Size 92277912 bytes
    Database Buffers 188743680 bytes
    Redo Buffers 2904064 bytes
    數據庫裝載完畢。
    數據庫已經打開。
    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博客,轉載請標明出處:http://blog.csdn.net/l1t/archive/2006/05/31/765125.aspx

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

            數據字典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';//表空間對應的數據文件

       select * from dba_segments
        where tablespace_name='INDEXS';
      3、數據庫對象:
       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';//聯接使用
      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;
      快照、分區應存在相應的表空間。
      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、數據庫鏈:
       select * from dba_db_links;
      在spbase下建數據庫鏈
       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、觸發器:
       select * from dba_trigers;
      存儲過程,函數從dba_objects查找。
      其文本:select text from user_source where name='BOOK_SP_EXAMPLE';
      建立出錯:select * from user_errors;
      oracle總是將存儲過程,函數等軟件放在SYSTEM表空間。
      13、約束:
      (1)約束是和表關聯的,可在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)定義約束可以無名(系統自動生成約束名)和自己定義約束名(特別是主鍵、外鍵)
      如:create table book_example
        (identifier number not null);
        create table book_example
        (identifier number constranit book_example_1 not null);
      14、回滾段:
      在所有的修改結果存入磁盤前,回滾段中保持恢復該事務所需的全部信息,必須以數據庫發生的事務來相應確定其大小(DML語句才可回滾,create,drop,truncate等DDL不能回滾)。
      回滾段數量=并發事務/4,但不能超過50;使每個回滾段大小足夠處理一個完整的事務;
       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監測回滾段的大小和動態增長。
      回滾段的區間信息
       select * from dba_extents
       where segment_type='ROLLBACK' and segment_name='RB1';
      回滾段的段信息,其中bytes顯示目前回滾段的字節數
       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';
      回滾段的當前狀態信息:
       select * from dba_rollback_segs
        where segment_name='RB1';
      比多回滾段狀態status,回滾段所屬實例instance_num
      查優化值optimal
       select n.name,s.optsize
        from v$rollname n,v$rollstat s
         where n.usn=s.usn;
      回滾段中的數據
       set transaction use rollback segment rb1;/*回滾段名*/
       select n.name,s.writes
        from v$rollname n,v$rollstat s
         where n.usn=s.usn;
      當事務處理完畢,再次查詢$rollstat,比較writes(回滾段條目字節數)差值,可確定事務的大小。
      查詢回滾段中的事務
       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、作業
      查詢作業信息
       select job,broken,next_date,interval,what from user_jobs;
       select job,broken,next_date,interval,what from dba_jobs;
      查詢正在運行的作業
       select * from dba_jobs_running;
      使用包exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (10/(24*60*60))')加入作業。間隔10秒鐘
    exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (11/(24*60))')加入作業。間隔11分鐘使用包exec dbms_job.remove(21)刪除21號作業。

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

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

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

    4. /*+RULE*/ 
    表明對語句塊選擇基于規則的優化方法. 
    例如: 
    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)*/ 
    提示明確表明對指定表根據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*/ 
    為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出位圖索引的布爾組合方式. 
    例如: 
    SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS 
    WHERE SAL<5000000 AND HIREDATE<SYSDATE; 

    11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/ 
    提示明確命令優化器使用索引作為訪問路徑. 
    例如: 
    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)*/ 
    對指定的表執行快速全索引掃描,而不是全表掃描的辦法. 
    例如: 
    SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305'; 

    14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/ 
    提示明確進行執行規劃的選擇,將幾個單列索引的掃描合起來. 
    例如: 
    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條件進行轉換為UNION ALL的組合查詢. 
    例如: 
    SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M'; 

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

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

    18. /*+REWRITE*/ 
    可以將視圖作為參數. 

    19. /*+MERGE(TABLE)*/ 
    能夠對視圖的各個查詢進行相應的合并. 
    例如: 
    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*/ 
    根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連接. 
    例如: 
    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)*/ 
    將指定表與嵌套的連接的行源進行連接,并把指定表作為內部表. 
    例如: 
    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所選擇的位置不同的表進行查詢執行. 
    例如: 
    SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO; 

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

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

    28. /*+NOCACHE(TABLE)*/ 
    當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端 
    例如: 
    SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 

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

    30. /*+NOAPPEND*/ 
    通過在插入語句生存期內停止并行模式來啟動常規插入. 
    insert /*+noappend*/ into test1 select * from test4 ;

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

    總結如下:

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

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



    根據代理機制的不同,總結了五種Spring事務的配置方式,配置文件如下:

        第一種方式:每個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.     <!-- 定義事務管理器(聲明式的事務) -->    
    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.            <!-- 配置事務管理器 -->    
    21.            <property name="transactionManager" ref="transactionManager" />       
    22.         <property name="target" ref="userDaoTarget" />    
    23.          <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />  
    24.         <!-- 配置事務屬性 -->    
    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.      <!-- 定義事務管理器(聲明式的事務) -->    
    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.          <!-- 配置事務管理器 -->    
    17.          <property name="transactionManager" ref="transactionManager" />    
    18.          <!-- 配置事務屬性 -->    
    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.      <!-- 定義事務管理器(聲明式的事務) -->    
    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.          <!-- 配置事務屬性 -->    
    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.     <!-- 定義事務管理器(聲明式的事務) -->    
    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.      <!-- 定義事務管理器(聲明式的事務) -->    
    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的例子,內容如下 1. xfire + spring 發布webservice 2. 利用 javascript  調用發布的webservice 使用xfire+spring發布webservice其實很簡單,遵循一下幾個步驟即可 1. 想要發布成文webservice的類,必須實現接口 ...  閱讀全文
    posted @ 2009-09-02 16:38 久久不醉 閱讀(3569) | 評論 (3)編輯 收藏
     
    xfire+spring 實踐記錄(一) 
    客戶端代碼: 
    1、將服務端的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、調用: 
    TestService client=(TestService)ServiceFactory.getBeanByName("testWebService"); 
        Map map=client.add(new HashMap(), 1, 2); 
        System.out.println("map value:"+map.get("p3")); 
    可以返回結果
    posted @ 2009-09-02 16:38 久久不醉 閱讀(549) | 評論 (0)編輯 收藏
     
    關鍵字: oracle的悲觀鎖和樂觀鎖
    為了得到最大的性能,一般數據庫都有并發機制,不過帶來的問題就是數據訪問的沖突。為了解決這個問題,大多數數據庫用的方法就是數據的鎖定。 

    數據的鎖定分為兩種方法,第一種叫做悲觀鎖,第二種叫做樂觀鎖。什么叫悲觀鎖呢,悲觀鎖顧名思義,就是對數據的沖突采取一種悲觀的態度,也就是說假設數據肯定會沖突,所以在數據開始讀取的時候就把數據鎖定住。而樂觀鎖就是認為數據一般情況下不會造成沖突,所以在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則讓用戶返回錯誤的信息,讓用戶決定如何去做。 

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

    注:對于悲觀鎖是針對并發的可能性比較大,而一般在我們的應用中用樂觀鎖足以。 


    Oracle的悲觀鎖需要利用一條現有的連接,分成兩種方式,從SQL語句的區別來看,就是一種是for update,一種是for update nowait的形式。比如我們看一個例子。首先建立測試用的數據庫表。 

    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用戶的表,把數據copy到我們的test表中。首先我們看一下for update鎖定方式。首先我們執行如下的select for update語句。 

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


    通過這條檢索語句鎖定以后,再開另外一個sql*plus窗口進行操作,再把上面這條sql語句執行一便,你會發現sqlplus好像死在那里了,好像檢索不到數據的樣子,但是也不返回任何結果,就屬于卡在那里的感覺。這個時候是什么原因呢,就是一開始的第一個Session中的select for update語句把數據鎖定住了。由于這里鎖定的機制是wait的狀態(只要不表示nowait那就是wait),所以第二個Session(也就是卡住的那個sql*plus)中當前這個檢索就處于等待狀態。當第一個session最后commit或者rollback之后,第二個session中的檢索結果就是自動跳出來,并且也把數據鎖定住。不過如果你第二個session中你的檢索語句如下所示。 

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



    也就是沒有for update這種鎖定數據的語句的話,就不會造成阻塞了。另外一種情況,就是當數據庫數據被鎖定的時候,也就是執行剛才for update那條sql以后,我們在另外一個session中執行for update nowait后又是什么樣呢。比如如下的sql語句。由于這條語句中是制定采用nowait方式來進行檢索,所以當發現數據被別的session鎖定中的時候,就會迅速返回ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源。所以在程序中我們可以采用nowait方式迅速判斷當前數據是否被鎖定中,如果鎖定中的話,就要采取相應的業務措施進行處理。 

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



    那這里另外一個問題,就是當我們鎖定住數據的時候,我們對數據進行更新和刪除的話會是什么樣呢。比如同樣,我們讓第一個Session鎖定住id=10的那條數據,我們在第二個session中執行如下語句。 

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



    這個時候我們發現update語句就好像select for update語句一樣也停住卡在這里,當你第一個session放開鎖定以后update才能正常運行。當你update運行后,數據又被你update 語句鎖定住了,這個時候只要你update后還沒有commit,別的session照樣不能對數據進行鎖定更新等等。 

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

    常用的做法來實現。 

    [1]第一種就是在數據取得的時候把整個數據都copy到應用中,在進行提交的時候比對當前數據庫中的數據和開始的時候更新前取得的數據。當發現兩個數據一模一樣以后,就表示沒有沖突可以提交,否則則是并發沖突,需要去用業務邏輯進行解決。 

    [2]第二種樂觀鎖的做法就是采用版本戳,這個在Hibernate中得到了使用。采用版本戳的話,首先需要在你有樂觀鎖的數據庫table上建立一個新的column,比如為number型,當你數據每更新一次的時候,版本數就會往上增加1。比如同樣有2個session同樣對某條數據進行操作。兩者都取到當前的數據的版本號為1,當第一個session進行數據更新后,在提交的時候查看到當前數據的版本還為1,和自己一開始取到的版本相同。就正式提交,然后把版本號增加1,這個時候當前數據的版本為2。當第二個session也更新了數據提交的時候,發現數據庫中版本為2,和一開始這個 session取到的版本號不一致,就知道別人更新過此條數據,這個 

    時候再進行業務處理,比如整個Transaction都Rollback等等操作。在用版本戳的時候,可以在應用程序側使用版本戳的驗證,也可以在數據庫側采用Trigger(觸發器)來進行驗證。不過數據庫的Trigger的性能開銷還是比較的大,所以能在應用側進行驗證的話還是推薦不用 Trigger。 

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

    Oracle鎖表(網上抄來的)

    鎖定類型

                   行級鎖

                   表級鎖

    行級鎖

             ---- 行被排他鎖定

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

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

             ----Oracle 通過使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 語句自動獲取行級鎖

    SELECT…FOR UPDATE 子句

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

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

    ―可以執行除更新之外的其他操作

    ―select * from goods where gid=1001

    ―for update of gname;

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

    FOR UPDATE WAIT 子句

    ―Oracle9i 中的新增功能

    ―防止無限期地等待鎖定的行

    ―等待間隔必須指定為數值文字

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

    變量

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

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

    表級鎖

    ―保護表的數據

    ―在多個用戶同時訪問數據時確保數據的完整性

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

              語法:lock table<table_name>in<mode>;

    共享鎖

    ―鎖定表

    ―僅允許其他用戶執行查詢操作

    ―不能插入、更新和刪除

    ―多個用戶可以同時在同一表中放置此鎖

    ―lock table table_name

    ―in share mode [nowait];

    ― rollback 和commit 命令釋放鎖

    ― nowait 關鍵字告訴其他用戶不用等待

    共享更新鎖

    ―鎖定要被更新的行

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

    ―在 SELECT 語句中使用“FOR UPDATE”子句,可以強制使用共享更新鎖

    ―允許多個用戶同時鎖定表的不同行

    加鎖的兩種方法

            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

    排他鎖

    ―與其他兩種鎖相比,排他鎖是限制性最強的表鎖

    ―僅允許其他用戶查詢數據

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

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

    ―共享鎖與此相反

             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) | 評論 (0)編輯 收藏
     
    Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。
    結構:
    HSSF - 提供讀寫Microsoft Excel格式檔案的功能。 
    XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。 
    HWPF - 提供讀寫Microsoft Word格式檔案的功能。 
    HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。 
    HDGF - 提供讀寫Microsoft Visio格式檔案的功能。
    創建Excel 文檔
    示例1將演示如何利用Jakarta POI API 創建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盤下*/
    public static String outputFile="D:\\test.xls";
    public static void main(String argv[]){
    try{
    // 創建新的Excel 工作簿
    HSSFWorkbook workbook = new HSSFWorkbook();
    // 在Excel工作簿中建一工作表,其名為缺省值
    // 如要新建一名為"效益指標"的工作表,其語句為:
    // HSSFSheet sheet = workbook.createSheet("效益指標");
    HSSFSheet sheet = workbook.createSheet();
    // 在索引0的位置創建行(最頂端的行)
    HSSFRow row = sheet.createRow((short)0);
    //在索引0的位置創建單元格(左上端)
    HSSFCell cell = row.createCell((short) 0);
    // 定義單元格為字符串類型
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    // 在單元格中輸入一些內容
    cell.setCellValue("增加值");
    // 新建一輸出文件流
    FileOutputStream fOut = new FileOutputStream(outputFile);
    // 把相應的Excel 工作簿存盤
    workbook.write(fOut);
    fOut.flush();
    // 操作結束,關閉文件
    fOut.close();
    System.out.println("文件生成...");
    }catch(Exception e) {
    System.out.println("已運行 xlCreate() : " + e );
    }
    }
    }
    讀取Excel文檔中的數據
    示例2將演示如何讀取Excel文檔中的數據。假定在D盤JTest目錄下有一個文件名為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{
    // 創建對Excel工作簿文件的引用
    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
    // 創建對工作表的引用。
    // 本例是按名引用(讓我們假定那張表有著缺省名"Sheet1")
    HSSFSheet sheet = workbook.getSheet("Sheet1");
    // 也可用getSheetAt(int index)按索引引用,
    // 在Excel文檔中,第一張工作表的缺省索引是0,
    // 其語句為:HSSFSheet sheet = workbook.getSheetAt(0);
    // 讀取左上端單元
    HSSFRow row = sheet.getRow(0);
    HSSFCell cell = row.getCell((short)0);
    // 輸出單元內容,cell.getStringCellValue()就是取所在單元的值
    System.out.println("左上端單元是: " + cell.getStringCellValue()); 
    }catch(Exception e) {
    System.out.println("已運行xlRead() : " + e );
    }
    }
    }
    設置單元格格式
    在這里,我們將只介紹一些和格式設置有關的語句,我們假定workbook就是對一個工作簿的引用。在Java中,第一步要做的就是創建和設置字體和單元格的格式,然后再應用這些格式:
    1、創建字體,設置其為紅色、粗體:
    HSSFFont font = workbook.createFont();
    font.setColor(HSSFFont.COLOR_RED);
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    2、創建格式
    HSSFCellStyle cellStyle= workbook.createCellStyle();
    cellStyle.setFont(font);
    3、應用格式 
    HSSFCell cell = row.createCell((short) 0);
    cell.setCellStyle(cellStyle);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue("標題 "); 
    處理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 久久不醉 閱讀(177) | 評論 (0)編輯 收藏
     
    1. 參數文件(parameter file, *.ora)
    兩種類型pfile和spfile,推薦使用spfile,pfile是字符型文件可以使用編輯器編輯,spfile是二進制文件,要使用set parameter參數進行修改。 使用set parameter進行參數修改時可以增加注釋,指定修改的作用范圍(memory,spfile,或者both),其中both是默認值;使用reset parameter修改原來的參數設置,其中sid選項必選。
    spfile和pfile可以互相生成,啟動數據庫時默認使用spfile,要使用pfile需要使用pfile='pfilename'進行指定; spfile保存在服務器,pfile保存在客戶端,使用alter system改變的系統配置寫入spfile,不寫入pfile。

    2. 調試文件(trace file, * .trc)
    兩種類型,一種是對調試應用有關系的文件,比如打開sql調試選項,就會在這些調試文件中增加信息;一種是內核產生錯誤時產生的調試文件,供orace支持人員使用。
    我們使用的調試文件有兩個存放位置,對于專屬服務器存放在udump文件夾下,具體可見user_dump_dest參數;共享服務器的調試文件一般存放在bdump文件夾下,具體可見background_dump_dest參數。
    從v$process, v$session, v$parameter, v$instance做關聯查詢可以知道目前session的trace文件。
    可以設置參數tracefile_identifier為當前session的trace文件增加tag。

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

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

    5. 控制文件(control files)
    控制文件是個小文件,最大64M;在參數文件中指明控制文件的位置;控制文件指明數據文件和在線重做日志文件的位置;控制文件記錄發生過的檢查點,數據庫名字,創建數據庫時的時間戳,歸檔日志的歷史等;
    控制文件應該在不同的磁盤上進行備份。

    6. 日志文件(log files)
    一般用于數據庫恢復,也可用于系統崩潰時的例程恢復,分為在線日志(online log file)和歸檔日志(archived log file).
    online redo log:
    有兩組或者多組在線重做日志,組內的每一個成員互為影射,組之間循環使用.
    在線重做日志組間的切換稱為log switch,這個時候如果數據庫配置不好容易發生服務暫停的情況,因為數據庫在切換日志組之前要確認該日志組已經沒有臟數據,如果有臟數據就要先寫入磁盤中,再進行切換。
    oracle在修改數據后,會先寫入SGA的對應區域,當commit的時候寫入在線日志文件,在check point或者重新啟動時由DBWn將修改寫入磁盤。
    設置online redo log的大小時要考慮:峰值的時候產生的日志規模;修改相同block的用戶數量;對數據庫恢復是否有時間要求。
    archived redo log:
    數據庫在日志的處理分為兩種類型:archivelog mode,在發生log switch時保存原來日志;noarchivelog,不保存原有日志,直接重用。
    生產環境中要使用archivelog mode,保證數據不丟失。

    7. 口令文件(password file)
    可選文件,為遠程啟動oracle提供驗證。

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

    1、內部級封鎖 
    內部級封鎖是用于保護ORACLE內部結構,由系統內部實現,用戶不能訪問,因此我們不必對此做過多的了解。 

    2、DDL級封鎖(字典/語法分析封鎖) 
    DDL級封鎖也是由ORACLE RDBMS來控制,它用于保護數據字典和數據定義改變時的一致性和完整性。它是系統在對SQL定義語句作語法分析時自動地加鎖,無需用戶干予。字典/語法分析封鎖共分三類: 
    (1)、字典操作鎖:用于對字典操作時,鎖住數據字典,此封鎖是獨占的,從而保護任何一個時刻僅能對一個字典操作。 
    (2)、字典定義鎖:用于防止在進行字典操作時又進行語法分析,這樣可以避免在查詢字典的同時改動某個表的結構。 
    (3)、表定義鎖:用于 一個SQL語句正當訪問某個表時,防止字典中與該表有關的項目被修改。 

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

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

    2、獨占方式表封鎖 
    獨占方式表封鎖是用于封鎖表中的所有數據,擁有該獨占方式表封鎖的用戶,即可以查詢該表,又可以更新該表,其它的用戶不能再對該表施加任何封鎖(包括共享、獨占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢該表。 
    獨占方式的表封鎖可通過如下的SQL語句來顯示地獲得: 
    LOCK TABLE <表名>[,<表名>].... 
    IN EXCLUSIVE MODE [NOWAIT] 
    獨占方式的表封鎖也可以在用戶執行DML語句INSERT、UPDATE、DELETE時隱含獲得。 
    擁有獨占方式表封鎖的事務,在出現如下條件之一時,便釋放該封鎖: 
    (1)、執行COMMIT或ROLLBACK語句。 
    (2)、退出數據庫(LOG OFF) 
    (3)、程序停止運行。 
    獨占方式封鎖通常用于更新數據,當某個更新事務涉及多個表時,可減少發生死鎖。 

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

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

    2、獨占方式表封鎖 
    獨占方式表封鎖是用于封鎖表中的所有數據,擁有該獨占方式表封鎖的用戶,即可以查詢該表,又可以更新該表,其它的用戶不能再對該表施加任何封鎖(包括共享、獨占或共享更新封鎖)。其它用戶雖然不能更新該表,但可以查詢該表。 
    獨占方式的表封鎖可通過如下的SQL語句來顯示地獲得: 
    LOCK TABLE <表名>[,<表名>].... 
    IN EXCLUSIVE MODE [NOWAIT] 
    獨占方式的表封鎖也可以在用戶執行DML語句INSERT、UPDATE、DELETE時隱含獲得。 
    擁有獨占方式表封鎖的事務,在出現如下條件之一時,便釋放該封鎖: <BR>(1)、執行   COMMIT或ROLLBACK語句。 
    (2)、退出數據庫(LOG OFF) 
    (3)、程序停止運行。 
    獨占方式封鎖通常用于更新數據,當某個更新事務涉及多個表時,可減少發生死鎖。 

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

    其中最后一行最后一列為其它用戶提供在不同行上設置SHARE UPDATE鎖。但當用戶1在某行上進行更新操作時,用戶2只有等待用戶1提交事務后,才能更新自己所封鎖的行。 

    中最后一行最后一列為其它用戶提供在不同行上設置SHARE UPDATE鎖。但當用戶1在某行上進行更新操作時,用戶2只有等待用戶1提交事務后,才能更新自己所封鎖的行。 
    死鎖 

    封鎖雖然能夠有效的解決并發操作,但是任何資源的獨占都會有死鎖的危險。例如:有兩個事務T1,T2,T1對數據A施加獨占封鎖,T2對數據B施加了獨占封鎖。再假設T1要對數據B加鎖,由于B已被T2獨占封鎖,因此T1置于等待狀態,等待B被釋放;現在若T2也要對A進行封鎖,由于A已被T1獨占封鎖,因此T2也被置于等待狀態。這樣就形成了兩個事務相互等待的狀態,而且永遠不能結束,此種情況稱為死鎖。 
    在Oracle系統中能自動發現死鎖,并選擇代價最小的,即完成工作量最少的事務予以撤消,釋放該事務所擁有的全部鎖,記其它的事務繼續工作下去。 
    從系統性能上考慮,應該盡可能減少資源競爭,增大吞吐量,因此用戶在給并發操作加鎖時,應注意以下幾點: 
    1、對于UPDATE和DELETE操作,應只封鎖要做改動的行,在完成修改后立即提交。 
    2、當多個事務正利用共享更新的方式進行更新,則不要使用共享封鎖,而應采用共享更新封鎖,這樣其它用戶就能使用行級鎖,以增加并行性。 
    3、盡可能將對一個表的操作的并發事務施加共享更新鎖,從而可提高并行性。 
    4、在應用負荷較高的期間,不宜對基礎數據結構(表、索引、簇和視圖)進行修改
    posted @ 2009-06-02 16:08 久久不醉 閱讀(121) | 評論 (0)編輯 收藏
     
    java中從oracle中取數據,轉化為String和Double顯示:
    String------->.11
    Double------->1.23456446412E10

    decode(substr(to_char(CHARGE_AMOUNT/100),1,1),'.','0'||to_char(CHARGE_AMOUNT/100),to_char(CHARGE_AMOUNT/100)) chargeAmountYuan
    posted @ 2009-04-08 12:23 久久不醉 閱讀(78) | 評論 (0)編輯 收藏
     
    create table test(name varchar2(8), password varchar2(12));
    comment on table test is '表備注';
    comment on column  test.name is '字段備注';
    posted @ 2009-03-31 17:31 久久不醉 閱讀(172) | 評論 (0)編輯 收藏
     
    Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)
    Ctrl+D: 刪除當前行

    Ctrl+Alt+↓ 復制當前行到下一行(復制增加)
    Ctrl+Alt+↑ 復制當前行到上一行(復制增加)

    Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)
    Alt+↑ 當前行和上面一行交互位置(同上)
    Alt+← 前一個編輯的頁面
    Alt+→ 下一個編輯的頁面(當然是針對上面那條來說了)

    Alt+Enter 顯示當前選擇資源(工程,or 文件 or文件)的屬性

    Shift+Enter 在當前行的下一行插入空行(這時鼠標可以在當前行的任一位置,不一定是最后)
    Shift+Ctrl+Enter 在當前行插入空行(原理同上條)

    Ctrl+Q 定位到最后編輯的地方
    Ctrl+L 定位在某行 (對于程序超過100的人就有福音了)
    Ctrl+M 最大化當前的Edit或View (再按則反之)
    Ctrl+/ 注釋當前行,再按則取消注釋
    Ctrl+O 快速顯示 OutLine
    Ctrl+T 快速顯示當前類的繼承結構
    Ctrl+W 關閉當前Editer
    Ctrl+K 參照選中的Word快速定位到下一個
    Ctrl+E 快速顯示當前Editer的下拉列表(如果當前頁面沒有顯示的用黑體表示)

    Ctrl+/(小鍵盤) 折疊當前類中的所有代碼

    Ctrl+×(小鍵盤) 展開當前類中的所有代碼

    Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來代替)

    Ctrl+Shift+E 顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)

    Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)

    Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)

    Ctrl+Shift+F4 關閉所有打開的Editer

    Ctrl+Shift+X 把當前選中的文本全部變味小寫

    Ctrl+Shift+Y 把當前選中的文本全部變為小寫

    Ctrl+Shift+F 格式化當前代碼

    Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)

    下面的快捷鍵是重構里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構的快捷鍵都是Alt+Shift開頭的了)

    Alt+Shift+R 重命名 (是我自己最愛用的一個了,尤其是變量和類的Rename,比手工方法能節省很多勞動力)

    Alt+Shift+M 抽取方法 (這是重構里面最常用的方法之一了,尤其是對一大堆泥團代碼有用)

    Alt+Shift+C 修改函數結構(比較實用,有N個函數調用了這個方法,修改一次搞定)

    Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多處調用的時候)

    Alt+Shift+F 把Class中的local變量變為field變量 (比較實用的功能)

    Alt+Shift+I 合并變量(可能這樣說有點不妥Inline)
    Alt+Shift+V 移動函數和變量(不怎么常用)
    Alt+Shift+Z 重構的后悔藥(Undo)

    posted @ 2009-03-31 14:49 久久不醉 閱讀(91) | 評論 (0)編輯 收藏
     
     關聯的兩張表,當數據少的那張要在數據多的那張表字段里,顯示為NULL時,就需要使用外連接。

      在講外連接之前,先舉例介紹內連接,也就是一般的相等連接。

      點擊下載:理解oracle中的外連接.doc

      select * from a, b where a.id = b.id;

      對于外連接,Oracle中可以使用“(+)”來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面將配合實例一一介紹。

      1. LEFT OUTER JOIN:左外關聯

      SELECT e.last_name, e.department_id, d.department_name

      FROM employees e

      LEFT OUTER JOIN departments d

      ON (e.department_id = d.department_id);

      等價于

      SELECT e.last_name, e.department_id, d.department_name

      FROM employees e, departments d

      WHERE e.department_id=d.department_id(+);

      結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄。

      2. RIGHT OUTER JOIN:右外關聯

      SELECT e.last_name, e.department_id, d.department_name

      FROM employees e

      RIGHT OUTER JOIN departments d

      ON (e.department_id = d.department_id);

      等價于

      SELECT e.last_name, e.department_id, d.department_name

      FROM employees e, departments d

      WHERE e.department_id(+)=d.department_id;

      結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。

      3. FULL OUTER JOIN:全外關聯

      SELECT e.last_name, e.department_id, d.department_name

      FROM employees e

      FULL OUTER JOIN departments d

      ON (e.department_id = d.department_id);

      結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的員工記錄和沒有任何員工的部門記錄。

    posted @ 2009-03-25 17:31 久久不醉 閱讀(89) | 評論 (0)編輯 收藏
     

    有關oracle 9i中的內連接,左外連接,右外連接問題                     

    1. 內連接很簡單
    select A.*, B.* from A,B where A.id = B.id
    select A.*, B.* from A inner join B on A.id = B.id
    以上兩句是完全等價的

    2. 左外連接
    select distinct(p.person_id) from t_pbase_info p, t_pcontact_info c where p.person_id = c.person_id(+)
    select distinct(p.person_id) from t_pbase_info p left join t_pcontact_info c on p.person_id = c.person_id
    以上兩句是完全等價的

    3. 右外連接
    select distinct(p.person_id) from t_pbase_info p, t_pcontact_info c where p.person_id(+) = c.person_id
    select distinct(p.person_id) from t_pbase_info p right join t_pcontact_info c on p.person_id = c.person_id
    以上兩句是完全等價的

    也就是說在oracle中+號放在=右邊相當于左連接,而+號放在=左邊相當于右連接

    posted @ 2009-03-24 14:41 久久不醉 閱讀(257) | 評論 (0)編輯 收藏
     
     在處理數據時發現一個問題,Oracle對于小于1的小數,小數點前面的0是不顯示的。
     
    SQL> create table t1_number (num number);
    Table created
     
    SQL> insert into t1_number values(0.3268);
    1 row inserted
     
    SQL> insert into t1_number values(0.57965686);
    1 row inserted
     
    SQL> insert into t1_number values(52345234.5686);
    1 row inserted
     
    SQL> insert into t1_number values(4.552686);
    1 row inserted
     
    SQL> commit;
    Commit complete
     
    SQL> column num format 99999999999.9999999999999
    SQL> select * from t1_number;
     
                           NUM
    --------------------------
                .3268000000000
                .5796568600000
        52345234.5686000000000
               4.5526860000000
     
     
     
        使用PL/SQL DEV工具查看時是有前面的0的
        通過column num format 000000000000.99999999999設置也可以顯示前面的0
     
        但是這些都只是顯示的結果,而不是數據庫保存結果
     
    SQL> column num format 00000000000.9999999999999
    SQL> select * from t1_number;
     
                           NUM
    --------------------------
     00000000000.3268000000000
     00000000000.5796568600000
     00052345234.5686000000000
     00000000004.5526860000000
     00000000005.2920000000000
     
    SQL> select substr(num,1,1) from t1_number;
     
    SU
    --
    .
    .
    5
    4
    5
     
        可以看到,無論前面出現多少位,通過substr函數獲取的第一位任然是'.'
     
     
        無論怎么轉換,只要最終輸出結果是數值型的,小數點前的0必然被丟棄,所以只有將數值轉換為字符型,大致有兩種方法:
     
     
    1、直接使用to_char函數
     
        首先實驗一下將小數點前和小數點后都加上99999999的格式:
     
    SQL> select to_char(num,'999999999.999999999') from t1_number;
     
    TO_CHAR(NUM,'9999999
    --------------------
              .326800000
              .579656860
      52345234.568600000
             4.552686000
             5.292000000
     
        發現小數點前還是沒有0,而小數點后的0多出來了
        再實驗一下小數點前和小數點后都加上0000000000格式:
     
    SQL> select to_char(num,'00000000000.000000000') from t1_number;
     
    TO_CHAR(NUM,'000000000
    ----------------------
     00000000000.326800000
     00000000000.579656860
     00052345234.568600000
     00000000004.552686000
     00000000005.292000000
     
        發現小數點前是有0了,但是兩邊的0都多出來了,使用FM來去掉多于的0:
     
    SQL> select to_char(num,'fm00000000000.000000000') from t1_number;
     
    TO_CHAR(NUM,'FM0000000
    ----------------------
    00000000000.326800000
    00000000000.579656860
    00052345234.568600000
    00000000004.552686000
    00000000005.292000000
     
        沒有效果,說明FM只能去掉用9表示的格式中產生的0:
     
    SQL> select to_char(num,'fm999999999.999999999') from t1_number;
     
    TO_CHAR(NUM,'FM99999
    --------------------
    .3268
    .57965686
    52345234.5686
    4.552686
    5.292
     
        但是這樣還是沒有0,最后發現可以將小數點前的第一位置為0即可(注意9的個數要大于數值的位數):
     
    SQL> select to_char(num,'fm999999990.999999999') from t1_number;
     
    TO_CHAR(NUM,'FM99999
    --------------------
    0.3268
    0.57965686
    52345234.5686
    4.552686
    5.292
     
        檢查一下第一位,沒有問題:
     
    SQL> select substr(to_char(num,'fm999999990.999999999'),1,1) from t1_number;
     
    SU
    --
    0
    0
    5
    4
    5
     
     
    2、使用decode函數
     
        既然小于1的小數首位必然是'.',那就判斷首位是否為'.',是則在前面加上'0'即可
     
    SQL> select decode(substr(num,1,1),'.','0'||num,num) from t1_number
     

    DECODE(SUBSTR(NUM,1,1),'.','0'||NUM,NUM)
    -----------------------------------------
    0.3268
    0.57965686
    52345234.5686
    4.552686
    5.292
     
        同樣檢查一下第一位,沒有問題
     
    SQL> select substr(decode(substr(num,1,1),'.','0'||num,num),1,1) fro
    m t1_number;
     
    SU
    --
    0
    0
    5
    4
    5
     
     
        也可以寫個函數來判斷一下,不過可以用decode直接出來,感覺也沒什么必要,暫時就這些吧。
    posted @ 2009-03-16 17:06 久久不醉 閱讀(1086) | 評論 (0)編輯 收藏
     
    declare
      i integer;
    begin
      i := 1;
      loop
        insert into trade_operation_check
          (ID, pay_charge, pay_manner, operate_sign)
        values
          (i,4,'SY','N');
        i := i + 1;
        exit when i > 10;
      end loop;
      commit;
    end;
    posted @ 2009-02-26 20:16 久久不醉 閱讀(510) | 評論 (0)編輯 收藏
     

      數據庫中 用戶a  訪問 用戶b 中表t_department    

         首先在 庫a中建立DBLinks 來鏈接兩個庫具體如下:

    create database link TESTLINK1
    connect to ACSYS//庫b的某個用戶名
    identified by "djzcq"http://對應的密碼
    using 'b';//所在服務器的庫命名

          然后建立同義詞 具體如下:

    CREATE SYNONYM user1.t_dpt_01 FOR acsys.t_department@TESTLINK1;//t_department是庫b中的表名

    commit;

          最后可以在庫a中訪問到庫b中的表了,具體如下:

    select * from t_dpt_01 ;

    值得主意的是:只能訪問指定的用戶所擁有訪問權限的表,例如庫a的用戶user1只能訪問庫b中用戶acsys所擁有權限的表或其它對象。

    posted @ 2009-02-17 16:10 久久不醉 閱讀(313) | 評論 (0)編輯 收藏
     
    object.equals比較的是兩個object的引用是否相等。
    string用==比較的是引用是否相等。 
    string.equals比較的是兩個字符串的值是否相等.
    posted @ 2009-02-04 11:44 久久不醉 閱讀(114) | 評論 (0)編輯 收藏
    CALENDER
    <2009年2月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    1234567

    留言簿

    隨筆檔案(54)

    文章分類

    搜索

    •  

    最新評論


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

    主站蜘蛛池模板: 亚洲宅男天堂在线观看无病毒| 国产精品白浆在线观看免费| 亚洲色大成网站www久久九| 久久精品蜜芽亚洲国产AV| 五月天网站亚洲小说| 亚洲av无码一区二区三区乱子伦 | 四虎国产精品永免费| 在线观看国产一区亚洲bd| 国产精品久久久久久亚洲小说| 亚洲丰满熟女一区二区哦| 欧美色欧美亚洲另类二区| 在线视频亚洲一区| 五月天婷婷精品免费视频| 大片免费观看92在线视频线视频| 九九免费观看全部免费视频| 国产VA免费精品高清在线| 最近免费中文字幕中文高清| 久久99精品视免费看| 在线看片免费人成视久网| 免费精品国产日韩热久久| 成人啪精品视频免费网站| 国产精品va无码免费麻豆| 精品亚洲成α人无码成α在线观看 | 特级毛片免费观看视频| 一个人晚上在线观看的免费视频| 老司机精品免费视频| 人妻无码一区二区三区免费| 人与禽交免费网站视频| 在线观看无码的免费网站| 四虎永久免费地址在线观看| 国产亚洲精品影视在线产品| 亚洲国产综合专区在线电影| 国产精品亚洲精品青青青| 国产亚洲精彩视频| 国产一级片免费看| 国产免费av片在线看| 亚洲国产精品尤物yw在线| 久久国产亚洲观看| 亚洲欧美日韩国产精品一区| 中文字幕在线观看免费| 99在线精品视频观看免费|