posts - 2, comments - 0, trackbacks - 0, articles - 0

          2005年10月21日


          1.通過接口可以實現不相關的類的相同行為.
          2.通過接口可以指明多個類需要實現的方法.
          3.通過接口可以了解對象的交互方法而不需要了解對象所對應的類藍本.


          一個普通數據庫的連結過程為:
              1.加載驅動程序.
              2.通過DriverManager到得一個與數據庫連結的句柄.
              3.通過連結句柄綁定要執行的語句.
              4.接收執行結果.
              5.可選的對結果的處理.
              6.必要的關閉和數據庫的連結.

          Class.forName方法是先在內存中溶解簽名為"org.gjt.mm.mysql.Driver"的Driver類,Driver類就會把相應的實現類對應到JDBC API的接口中.注冊驅動程序有多方法,Class.forName();是一種顯式地加載.當一個驅動程序類被Classloader裝載后,在溶解的過程中,DriverManager會注冊這個驅動類的實例.這個調用是自動發生的,也就是說DriverManager.registerDriver()方法被自動調用了

          在成功注冊驅動程序后,我們就可以用DriverManager的靜態方法getConnection來得到和數據庫連結的引用:
              Connection conn = DriverManager.getConnection(url);
              如果連結是成功的,則返回Connection對象conn,如果為null或拋出異常,則說明沒有
          和數據庫建立連結.

          如果我們要對數據庫中的表進行操作,要先緣故綁定一個語句:
              Statement stmt = conn.createStatement();
              然后利用這個語句來執行操作.根本操作目的,可以有兩種結果返回,如果執行的查詢
          操作,返回為結果集ResultSet,如果執行更新操作,則返回操作的記錄數int.
              注意,SQL操作嚴格區分只有兩個,一種就是讀操作(查詢操作),另一種就是寫操作(更
          新操作),所以,create,insert,update,drop,delete等對數據有改寫行為的操作都是更新操作.

          關于Statement對象:
                前面說過,Statement對象是用來綁定要執行的操作的,在它上面有三種執行方法:即用來執行查詢操作的executeQuery(),用來執行更新操作的executeUpdate()和用來執行動態的未知的操作的execute().一個Statement對象同時只能有一個結果集在活動.這是寬容性的,就是說即使沒有調用ResultSet的close()方法,只要打開第二個結果集就隱含著對上一個結果集的關閉.所以如果你想同時對多個結果集操作,就要創建多個Statement對象,如果不需要同時操作,那么可以在一個Statement對象上須序操作多個結果集

           Statement的兩個子類:
              PreparedStatement:對于同一條語句的多次執行,Statement每次都要把SQL語句發送給數據
          庫,這樣做效率明顯不高,而如果數據庫支持預編譯,PreparedStatement可以先把要執行的語句一次發
          給它,然后每次執行而不必發送相同的語句,效率當然提高
          PreparedStatement ps = conn.prepareStatement("select * from 表 where 字段=?");
              ps.setString(1,參數);
              ResultSet rs = ps.executeQuery();
             
              CallableStatement:是PreparedStatement的子類,它只是用來執行存儲過程的.
              CallableStatement sc = conn.prepareCall("{call query()}");
              ResultSet rs = sc.executeQuery();

          ResultSet對象實際維護的是一個二維指針,第一維是指向當前行,最初它指向的是結果集的第一行之前,所以如果要訪問第一行,就要先next(),以后每一行都要先next()才能訪問,然后第二維的指針指向列,只要當你去rs.getXXX(列)時,才通過Connection再去數據庫把真實的數據取出來,否則沒有什么機器能真的把要取的數據都放在內存中.

          如果有記錄又不知道是多少行,這時如果要對有記錄和沒有記錄進行不同的處理,應該用以下流程進行判斷:

              if(rs.next()){
                  //因為已經先next()了,所經對記錄應該用do{}while();來處理
                  do{
                      int i = rs.getInt(1);
                      String a = rs.getString("a2");
                  }while(rs.next());
              }
              esle{
                  System.out.println("沒有取得符合條件的記錄!");
              }

          獲取結果集的信息:
              大多數情況下編程人員對數據庫結構是了解的,可以知道結果集中各列的情況,但有時并
          不知道結果集中有哪些列,是什么類型.這時可以通過getMetaData()來獲取結果集的情況:

              ResulSetMetaData rsmd = rs.getMetaData();
              rsmd.getColumnCount()返回列的個數.
              getColumnLabel(int)返回該int所對應的列的顯示標題
              getColumnName(int)返回該int所對應的列的在數據庫中的名稱.
              getColumnType(int)返回該int所對應的列的在數據庫中的數據類型.
              getColumnTypeName(int)返回該int所對應的列的數據類型在數據源中的名稱.
              isReadOnly(int)返回該int所對應的列是否只讀.
              isNullable(int)返回該int所對應的列是否可以為空

          posted @ 2005-10-21 16:57 大雄 閱讀(184) | 評論 (0)編輯 收藏

          http://www.cnjsp.org/view.jsp?column=2&id=12
          使用連結池的意義 (2003-11-26 18:50)

          一個普通的連結過程中,因為Connection一般要用到本地方法,這些初始化是非常耗用系統資源的,說明在一次連結中真正執行語消耗的資源是很少的.

          如果你的服務器平均每5分種才有一次連結,你當然只用這種普通連結,因為整個一次連結過程才0.0幾秒,你不必要再讓連結池在余下的4.9幾秒中也開著消耗資源,但如果每秒種有10次連結,這時普通連結消耗的初始化資源就很高了,用連結池就能顯示它的優勢.所以到底采用什么方式連結,完全要根據你的應用,而且要進行實實在在的并發仿真測試.不要看到書上說什么方式好就相信,真正的構架一個平臺是一種藝術而不只是一種技術,要多方面綜合測試找到最佳的組合.很多陷井并不是技術所能發現的.比如你查看你的JVM還有很多空閑資源,但系統卻已經崩潰了.因為象連結初始化這種資源消耗在本地方法中,JVM是反映不出來的,但卻在同一物理內存中,還有很多這樣的陷井,重要的是經驗和測試!

          posted @ 2005-10-21 16:56 大雄 閱讀(154) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 页游| 湘西| 息烽县| 潢川县| 涞源县| 北京市| 临高县| 偏关县| 简阳市| 营口市| 建阳市| 保靖县| 黔南| 中西区| 手机| 特克斯县| 龙海市| 汉源县| 饶平县| 丹棱县| 岑溪市| 新昌县| 灵寿县| 额敏县| 周口市| 沭阳县| 新营市| 苗栗县| 宾阳县| 凌海市| 江口县| 东阳市| 遂宁市| 壶关县| 东安县| 宁河县| 绥滨县| 塔河县| 东阿县| 吴川市| 桃园市|