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

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

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

    JDBC 學習筆記3

    在上次的學習筆記中主要說明了一下JDBC的是如何獲取DIRVER的的工作原理,以及簡單的介紹了一下六個步驟。
    今天的筆記主要內容是[JDBC Advanced Topics]異常處理、元數據以及事務。
    1、異常 Exception
        java.sql.SQLException          對底層數據庫異常的封裝,它是一個已檢查異常。所以應用程序必須對它做處理。
            .getErrorCode();                獲取特定于數據庫供應商的錯誤代碼。
        java.sql.SQLWaring extends SQLExecption         提供關于數據庫訪問警告信息的異常。

    例:
    1try{
    2//此處省略
    3}
     catch(SQLException e){
    4      while(e != null){
    5          e.printStackTrace();
    6          e = e.getNextExecption();
    7      }

    8}

    2、元數據:用來描述其他數據的數據
    JDBC中的元數據:
    ResultSetMetaDate: 結果集元數據,它用來描述結果集本身。
    ResultSet.getMetaDate(); 獲取當前結果集的元數據。
    DatabaseMetaDate: 數據庫元數據,用來描述數據庫本身。
    Connection.getMetaDate(); 獲取當前數據庫的元數據。

    例:
    //利用元數據打印出結果集
    public void executeSQL(String sqlcommand){
     Connection con 
    = null;
     Statement stm 
    = null;
     ResultSet rs 
    = null;
     
    try{
      
    //這里的ConnectionFactory是寫的一個連接工廠,這里就不做介紹了。
      con = ConnectionFactory.getConnection();
      stm 
    = con.createStatement();
      
    boolean flag = stm.execute(sqlcommand);
      
    if(flag){
       rs 
    = stm.getResultSet();
       ResultSetMetaDate rsmd 
    = rs.getMetaDate();
       
    int columns = rsmd.getColumnCount();
       
    for(int i=1;i<columns;i++){
        String columnName 
    = rsmd.getColumnLabel(i);
        System.out.print(columnName
    +"\t");
       }

       System.out.println();
       
    while(rs.next()){
        
    for(int i=1;i<columns;i++){
         Object content 
    = rs.getObject(i);
         System.out.print(content
    +"\t");
        }

        System.out.print();
       }
    else{
        
    int results = stm.getUpdateCount();
        System.out.println(results
    +" resultes was update ");
       }

      }

     }
    catch(SQLExecption e){
        
    //此處省略若干
     }

    }

    3、DML的操作 [JDBC的事務] 以事務為單位
    JDBC事務:
    定義:一組相關的操作,不可分割,一起成功,一起失敗。
    相關操作:
    Connection:
        commit(); JDBC事務提交
        rollback(); JDBC事務回滾
    JDBC的事務默認情況下是自動提交的,每執行一次SQL命令,就提交commit一次。[AutoCommit]
    如:
    轉帳(){
        ...
        update t_account1 set balance = balance-100;
        update t_account2 set balance = balance+100;
        ...
    }
    如何讓以上兩句SQL語句,一起執行,一起失敗。所以就需要把他們放在一個事務中。
    如:
    轉帳(){
        ...
        con.setAutoCommit(false);//關閉自動事務提交
        update t_account1 set balance = balance-100;
        update t_account2 set balance = balance+100;
        如果以上兩句都成功,則:
        con.commit();//提交事務
        如果以上任意一個失敗,則:
        con.rollback();//事務回滾
    }

    獲取主鍵方式(主鍵值生成策略)
    主鍵值不應該由UI界面來收集,而應該由應用程序自動生成,常見的策略如下:
    a. max(id)方法
        select max(id) from table_name;
        此方法當有多線程并發時,就會產生問題。
    b. sequence 序列
        select sequence.nextval from dual;
        此方法只適用支持序列的數據庫產品,所以不是很通用。
    c. 維護單行單列得表
    1    create table id_table(next_id number not null);
    2    insert into id_table next_id values(1);
    3    commit;
    4    --使用以下SQL自動維護
    5    select next_id from id_table for update;
    6    update id_table set next_id = next_id+1;
    7    commit;

    并發控制:多個事務同時操作同一個對象
    有三種并發情況,如下:
    1、臟讀                Dirty reads                讀到其他事務沒有提交的數據。注:Oracle不支持
    2、不可重復讀    Repeatable reads     同一個事務在兩個不同的時刻讀取不同結果
    如:
    1T1:select score from t_score where id= 48;
    2T2:update t_score set score = score+10 where id = 48;
    3T1:select score from t_score where id= 48;
    解決重復讀問題:
    讓T1在查詢語句中加入for update子句,從而把選定的記錄加上排他鎖;那么T1事務完成之前,其他事務是不能來獲取鎖資源的。
    3、幻影讀            Phanton reads          記錄數量變化,而不是行記錄的列值
    1T1:elcet count(*from t_class where classname = '******';
    2T2:nsert into t_class values(.);
    3    commit();
    4T1:selcet count(*from t_class where classname = '******';
    5
    解決幻影讀問題:
    鎖表:lock table table_name in mode;

    事務隔離級別:SUN在JDBC規范中制定了5個級別,分別用來滿足不同的并發性。
    Connection:
    0        .TRANSACTION_NONE                                無
    1        .TRANSACTION_READ_UNCOMMITED     可以臟讀
    2        .TRANSACTION_READ_COMMITED           不可以臟讀
    4        .TRANSACTION_REPEATABLE                    不可以重復讀
    8        .TRANSACTION_SERIALIZABLE                  為每個事務都開辟一個空間
    事務的隔離界別設置得越高,則并發性能越差
    注:不同數據庫,對隔離級別的支持也是不一樣的。
    如:oracle就不支持0和1兩種。

    如何設置隔離級別?
    如:con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITED);
    這個也是默認事務隔離級別。

    My Java study notes.

    posted on 2008-10-01 23:03 mailguest 閱讀(525) 評論(0)  編輯  收藏 所屬分類: JDBC


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

    ~~~~~~JAVA學習筆記~~~~~~

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲狠狠婷婷综合久久蜜芽| 亚洲视频小说图片| 国产精品亚洲综合网站| 好吊妞视频免费视频| 77777亚洲午夜久久多喷| 欧美在线看片A免费观看| 亚洲欧美日韩中文高清www777| 免费人成视频在线| 亚洲av中文无码字幕色不卡| 国产99视频精品免费视频7| 男男gvh肉在线观看免费| 亚洲国产成人VA在线观看| 国产yw855.c免费视频| 性色av极品无码专区亚洲| www.亚洲精品.com| 久久国产乱子伦精品免费午夜| 国产精品国产亚洲精品看不卡| 国内成人精品亚洲日本语音| 又黄又大又爽免费视频| AAAAA级少妇高潮大片免费看| 亚洲AV无码一区二区乱子伦| 永久免费在线观看视频| 亚洲中文字幕无码久久| 亚洲国产一级在线观看| 67pao强力打造国产免费| 亚洲精品天堂在线观看| 7723日本高清完整版免费| 亚洲kkk4444在线观看| 亚洲欧洲中文日韩av乱码| 久久久久免费看成人影片| 国产中文字幕免费观看| 巨胸狂喷奶水视频www网站免费| 亚洲国语精品自产拍在线观看| 很黄很黄的网站免费的| 日本亚洲欧美色视频在线播放| 激情综合色五月丁香六月亚洲| 一区二区三区AV高清免费波多| 久久噜噜噜久久亚洲va久| 无码高潮少妇毛多水多水免费| 亚洲最大中文字幕无码网站| 亚洲成年看片在线观看|