標籤:基本 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 & 串連池 & 總結