JDBC鏈接池和DBUtils

鏈接池思想
  在數據庫鏈接時,Connection資源很是珍貴,但又頻繁被使用,因此建立一個容器來專門管理這些鏈接

使用鏈接池實現Connection複用:
  1.建立一個鏈接池對象
  2.鏈接池對象生成並管理若干鏈接
    (線程池中的線程是本身在線程池中使用線程,使用以後線程池將線程回收給後面的線程使用)
    (鏈接池對象本身生成鏈接對象,咱們使用時直接從鏈接池獲得鏈接對象)(線程池是先使用線程,在交給線程池管理,一個是鏈接池先建立鏈接,在給使用)java

  3.當與數據庫交互時,從鏈接池獲取鏈接
  4.鏈接使用完,之前是直接釋放,如今直接存回鏈接池
  5.存回鏈接池的目的是供下次使用

  優勢:
    A.實現Connection的複用
    B.效率更高

Java中經常使用的數據庫鏈接池實現(管理程序與數據庫的鏈接)
  C3p0 ----- 用xml配置文件規範
  DBCP ----- 用properties配置文件規範

C3p0鏈接池使用
  A:必須下載相關jar包
    鏈接池管理鏈接的,必須還得導入mysql與java鏈接的jar包才能正常使用
  B:建立鏈接池對象,傳入相關的配置信息(具體要使用哪種配置的鏈接池)
    必須配置的四個配置項(驅動名,url,帳號,密碼)
    可選配置項,鏈接的管理策略----初始化鏈接個數,最大鏈接數,空閒時的最小鏈接數......
  C:從鏈接池對象取鏈接,並使用
  D:將鏈接存回鏈接池
C3p0總結
  1.導包
  2.配置文件直接複製到src下面,注意必須在src下,且文件名不能修改
   固定:c3p0-config.xml  由於解析原碼被底層封裝
  3.建立鏈接池對象
    DataSource ds = new ComboPooledDataSource();
    底層實現:
      A:自動讀取並解析配置文件
      B:根據解析的數據建立若干鏈接
        解析c3po-config.xml
        用集合嵌套進行解析
          Map<String(name-config的屬性),HashMap<String(property的屬性),String(property的文本)>>
          內層HashMap中存的是,元素屬性值,元素文本值(鏈接池的具體配置信息)
          外層Map中存儲的是具體使用哪一條配置信息來建立相應的鏈接池
   4.獲取鏈接 使用
     ds.getConnection(); 從鏈接池取出一個鏈接
   5.鏈接用完以後存回鏈接池
     con.close(); 這是使用的鏈接池重寫以後的Close方法,將鏈接放回,沒有釋放  其它使用的資源須要釋放
  特色:資源複用,效率高,底層實現隱藏
C3p0解析配置文件時,配置文件中能夠有多套配置信息
  default-config(默認配置,只能有一個)和named-config(命名配置,能夠0或多個)
  使用方法:
    DataSource ds = new ComboPooledDataSource; //默認配置
    DataSource ds = new ComboPooledDataSource("配置文件中對應的name的值")
    經常使用的配置最好放在xml的前面,由於xml解析存在效率問題
    C3p0的配置也可使用編碼的方式完成,但由於是硬代碼,靈活性太差mysql

DBCP
  A:導入jar包
  B:建立鏈接池對象
    1.導入配置文件
    2.建立輸入流以及Properties集合,將數據讀入集合(經過類加載器中的方法直接讀src目錄下面的文件)
    3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
  C:獲取並使用鏈接
    Connection con = ds.getConnection()
  D:存回鏈接池
    con.close()
    抽取數據庫鏈接池工具類,不用每次都建立一個鏈接池sql

DBUtils:
  和鏈接池一塊兒使用,封裝了一系列的「處理對象」處理和「結果」處理
  JavaBean書寫規範
    A:必須有包
    B:必須實現序列化接口
    C:屬性私有,提供公共的訪問方式
    D:必須提供無參構造public
  使用:
    A:QueryRunner qr = new QueryRunner(數據庫鏈接池對象)  
    B:查詢操做
      qr.query(參數1,參數2,參數3)
        參數1 —— SQL語句
        參數2 —— 結果集(須要的代理對象)
        參數3 —— 補齊SQL語句的參數(佔位符的值)(底層使用預處理對象preparedStatement)
    C:封裝鏈接返回線程池
實現細節:
    1:QueryRunner 執行SQL語句時,會從數據庫鏈接池取出一個鏈接
      使用完,本身將鏈接存回線程池
    2:查詢時,query("SQL語句",new BeanListHandler<泛型>(反射對象),[佔位符參數])
      此條代理對象返回的是一個List<JavaBean>集合,存儲每一條數據所對應的對象
      BeanListHandler怎麼代理咱們執行的?
        A:BeanListHandler 中的泛型決定了返回的集合的泛型
        B:根據反射對象獲取無參構造,建立對象
        C:取出表記錄中的字段名和字段值,利用反射和方法名拼接,爲對象賦值
        D:將對象存入集合而後返回

    代理對象:
      BeanHandler        將單條記錄(多條記錄的狀況下,第一天記錄)組裝成JavaBean對象
      ArrayHandler       將單條記錄(多條數據選取第一條)的每個字段值存儲進一個Object數據
      ArrayListHandler      將每一條記錄的每個字段值存爲一個數組,將全部數組存進集合
      ScalarHandler      查詢單個結果(聚合函數)
      ColumanListHandler  將某一列的值存入一個集合
      MapHandler        將第一條記錄的字段名做爲鍵,字段值做爲值存入一個Map集合
      MapListHandler     將每一條記錄轉換成Map,再將Map存入List選一個值做爲Map集合所對應鍵,而後值爲其對應的Map字段名字段值集合
      KeyedHandler       選一個值做爲Map集合所對應鍵,而後值爲其對應的Map字段名字段值集合
  增刪改操做使用update方法,返回Long
    Long line = qr.update(sql, params);數據庫

若是建立QueryRunner的時候沒有傳入鏈接詞對象數組

    List<User> rs = qr.query(C3p0Utils.getDs().getConnection(), sql, new BeanListHandler<User>(User.class));緩存

池:
  字符串常量池
  包裝類緩存池
  數據庫鏈接池
  線程池
  音樂池
資源複用,效率高函數

相關文章
相關標籤/搜索