MySql & JDBC & 串連池 & 總結

來源:互聯網
上載者:User

標籤:基本   getname   關閉   釋放   creates   result   try   參數   new   

串連池:解決資源浪費,提高代碼效能。本小節目標:使用DBCP,C3P0串連池完成基本資料庫的操作。使用DBUtils完成CRUD的操作。 資料庫連接池的解決方案是:當應用程式啟動時,系統主動建立足夠的資料庫連接,並將這些串連組成一個串連池。每次應用程式請求資料庫連接時,無須重新開啟串連,而是從串連池中取出已有的串連使用,使用完後不再關閉資料庫連接,而是直接將串連歸還給串連池。通過使用串連池,將大大提高程式的運行效率。 資料庫連接池是Connection 對象的工程。資料庫連接池的常用參數如下。a、資料庫的初始串連數b、串連池的最大串連數c、串連池的最小串連數d、串連池每次增加的容量 公用介面:javax.sql.DataSource。常見的串連池:DBCP 、 C3P0 (主要) 自訂串連池代碼實現改進(增強close方法):    自訂串連池中存在的嚴重問題,使用者調用getConnection()獲得串連後,必須使用release()方法進行串連的歸還,如果使用者調用conn.close()將串連真正的釋放,串連池中將出現無串連可以。 方法增強辦法:a、繼承,子類繼承父類,將父類的方法進行複寫,從而進行增強。    使用前提:必須有父類,且存在繼承關係。b、裝飾者設計模式,此設計模式專門用於增強方法。    使用前提:必須有介面    缺點:需要將介面的所有方法都實現c、動態代理:在運行時動態建立代理類,完成增強操作。與裝飾者相似    使用前提:必須有介面    痛點:需要反射技術d、位元組碼增強,運行時建立目標類子類,從而進行增強    常見第三方架構:cglib 、javassist等。 串連池釋放資源問題(WEB_10視頻05自訂串連池代碼實現改進(增強close方法)):使用 c3p0 的話,也是 java.sql.Connection,只要是 JDBC 都是這個介面的對象! 使用完後必須 con.close() 掉,使用串連池的話,執行 con.close 並不會關閉與資料庫的 TCP 串連,而是將串連還回到池中去,如果不 close 掉的話,這個串連將會一直被佔用,直接連接池中的串連耗盡為止。 至於是如何做到 con.close 並不是真正意義上的關閉串連?而是直接將串連還回到池中去? 一般有兩種方式: 一:使用裝飾器模式,在裝飾器構造中傳入一個真正的 Connection,這個裝飾器實現 Connection,使用構造 傳入 Connection 委託重寫所有方法,並改寫 close 方法: Java code ?
123456789101112131415161718192021222324252627 public class ConnectionDecorator implements Connection {     private Connection con = null;         public ConnectionDecorator(Connection con) {        this.con = con;    }         public void close() throws SQLException {        // 重寫!    }     public void commit() throws SQLException {        this.con.commit();    }     public Statement createStatement() throws SQLException {                return this.con.createStatement();    }     public Statement createStatement(int resultSetType, int resultSetConcurrency)            throws SQLException {        return this.con.createStatement(resultSetType, resultSetConcurrency);    }     ......}
   然後經過串連池控制的 Connection 對象都使用該裝飾器進行封裝 二:動態代理: 使用動態代理重新實現 close 方法,每個獲得 Connection 是一個代理後的對象。  一個完善的串連池,其架構設計非常複雜,Connection#close 問題就是串連池諸多設計痛點當中的一個。  總結:關於學習MySql 以及JDBC方面的總結!一、MySql  MySQL基本命令SQL(全稱)語句基礎:DML 、 DDL 、 DCL 、 DQL資料庫約束查詢(單表、多表   左右串連等)truncate  和  delete比較?等等等 二、JDBC編程步驟1、載入驅動     c3p0-config.xmldb.properties     2、擷取串連    串連池概念步驟   J3P0(XML)3、DBUtils   完成CRUD (增刪改查)封裝JDBC操作,簡化JDBC操作JavaBean組件(封裝資料)   包:com.scalpet.domain4、使用完串連池後:釋放資源得出結論,DBUtils在建立QueryRunner時傳入dataSource對象每次在執行完之後都會自動關閉Connection連線物件~所以再也不用擔心沒有關閉對象而導致的問題了~如果沒有傳入dataSource的話 ·····需要手動關閉 三、練習a、建立工程---java projectb、匯入JDBC串連的jar包---jar包都添加在新檔案夾lib下面c、匯入c3p0jar包d、編寫c3p0-config.xml檔案e、編寫C3P0工具類---其核心工具類ComboPooledDataSource(命名配置、預設配置)---工具類都放在建立包com.scalpel.utils包下f、編寫JavaBean組件User----組件在建立包com.scalpel.domain包下g、匯入DBUtils的jar包h、編寫DBUtils的測試java類 代碼實現:c3p0-config.xml<?xml version="1.0" encoding="UTF-8"?><c3p0-config>   <default-config>    <property name="driverClass">com.mysql.jdbc.Driver</property>       <property name="jdbcUrl">jdbc:mysql:///web</property>       <property name="user">root</property>       <property name="password">12345678</property>       <property name="initialPoolSize">5</property>       <property name="maxPoolSize">20</property>  </default-config>   <named-config name="scalpel">    <property name="driverClass">com.mysql.jdbc.Driver</property>       <property name="jdbcUrl">jdbc:mysql:///web</property>       <property name="user">root</property>       <property name="password">12345678</property>  </named-config>  </c3p0-config> C3P0Utils工具類:package com.scalpel.jdbc.utils; import java.sql.Connection;import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Utils {              //使用命名配置       private static ComboPooledDataSource dataSource = new ComboPooledDataSource("scalpel");              /*        * 獲得資料來源(串連池)        */       public static DataSource getDataSource()       {             return dataSource;       }              /*        * 獲得串連        */       public static Connection getConnection()       {             try {                    return dataSource.getConnection();             } catch (SQLException e) {                    throw new RuntimeException();             }       }} userbean組件類:package com.scalpel.domain; public class User {              private  int id;       private  String name;       private  String password;       public int getId() {             return id;       }       public void setId(int id) {             this.id = id;       }       public String getName() {             return name;       }       public void setName(String name) {             this.name = name;       }       public String getPassword() {             return password;       }       public void setPassword(String password) {             this.password = password;       }              } 串連測試類別:package com.scalpel.jdbc.link; import java.sql.SQLException;import java.util.List; import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.junit.Test; import com.scalpel.domain.User;import com.scalpel.jdbc.utils.C3P0Utils; public class LinkJDBC {        /*        * 添加使用者        */       @Test       public void AddUser() {             try {                    // 1.串連資料來源串連池                    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());                    // 2.編寫sql語句                    String sql = "insert into user values( ?, ?, null )";                    // 3.添加params參數                    Object[] params = { "ctxixi", "123" };                    // 4.執行sql語句                    int rows = qr.update(sql, params);                    // 5.判斷是否執行成功                    if (rows > 0) {                           System.out.println("添加成功");                    } else {                           System.out.println("添加失敗");                    }             } catch (SQLException e) {                    e.printStackTrace();             }       }        /*        * 查詢使用者,使用BeanListHandler        */       @Test       public void QueryAllUserInf()       {             try {                    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());                    String sql = "select * from user";                    List<User> queryUser = qr.query(sql, new BeanListHandler<User>(User.class));                    for (User user : queryUser)                    {                           System.out.println(user.getId() +"、" + user.getName() + " : " + user.getPassword());                                          }                                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();             }       } }  

MySql & JDBC & 串連池 & 總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.