JDBC(二) —— 資料庫連線池
阿新 • • 發佈:2020-08-13
一、概述
1. 概念
使用者從容器(資料庫連線池)中獲取連線,不會向系統底層申請資源。
資料庫連線池就是一個容器(集合),存放資料庫連線的容器
當系統初始化好後,容器被建立,容器中會申請一些連線物件 ,使用者訪問完之後,會將連線物件歸還給容器。
2. 好處:節約資源;使用者訪問高效。
二、實現
1. 標準介面:DataSource javax.sql包下的
方法:
獲取連線 getConnection()
歸還連線:如果連線物件Connection是從連線池中獲取的,那麼呼叫connection.close()方法,則不會再關閉連線了,而是歸還連線。
一般我們不去實現它,由資料庫廠商來實現
C3P0:資料庫連線池技術
druid:資料庫連線池實現技術,由阿里巴巴提供,高效
三、數據庫連線池 —— c3p0基本使用
1. 步驟:
(1)匯入jar包(兩個): c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar,以及資料庫驅動jar包
(2)定義配置檔案:
名稱:c3p0.properties或者c3p0-config.xml
路徑:直接將檔案放在src目錄下即可
(3)建立核心物件 資料庫連線池物件 ComboPooledDataSource
(4)獲取連線 getConnection
例項配置檔案c3p0-config.xml
<c3p0-config> <!-- 使用預設的配置讀取連線池物件 --> <default-config> <!-- 連線引數 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property> <property name="user">root</property> <property name="password">root</property> <!-- 連線池引數 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">3000</property> </default-config> <named-config name="otherc3p0"> <!-- 連線引數 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property> <property name="user">root</property> <property name="password">root</property> <!-- 連線池引數 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
例項程式碼
1 package cn.itcast.datasource.c3p0; 2 3 import com.mchange.v2.c3p0.ComboPooledDataSource; 4 5 import java.sql.Connection; 6 import java.sql.SQLException; 7 8 import javax.sql.DataSource; 9 10 /** 11 * c3p0演示 12 */ 13 public class C3P0Demo2 { 14 public static void main(String[] args) throws SQLException { 15 //1.1獲取DataSource,使用預設配置 16 //DataSource ds = new ComboPooledDataSource(); 17 //1.2獲取DataSource,使用指定名稱配置 18 DataSource ds = new ComboPooledDataSource("otherc3p0"); 19 //2.獲取連線 20 for(int i = 1; i<=10; i++){ 21 Connection conn = ds.getConnection(); 22 System.out.println(i+":"+conn); 23 24 if(i == 5){ 25 conn.close();//歸還連線到連線池 26 } 27 } 28 29 } 30 }
四、資料庫連線池——druid使用
1. 使用步驟
(1)匯入jar包 druid-1.0.9.jar
(2)定義配置檔案
是properties形式的
可以叫任意名稱,可以放在任意目錄下(不會自動載入)
(3)載入配置檔案 Properties
(4)獲取資料庫連線池物件 DataSource:通過工廠類來獲取 DruidDataSourceFactory
(4)獲取連線:getConnection方法
示例程式碼
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db2 username=root password=root #初始化連結數量 initialSize=5 #最大連線數 maxActive=10 #最大等待時間 maxWait=3000
DruidDemo.java
1 package cn.itcast.datasource.druid; 2 3 import com.alibaba.druid.pool.DruidDataSourceFactory; 4 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.sql.Connection; 8 import java.util.Properties; 9 10 import javax.sql.DataSource; 11 12 /** 13 * druid演示 14 */ 15 public class DruidDemo { 16 public static void main(String[] args) throws Exception { 17 //1.匯入jar包 18 19 //2.定義配置檔案 20 21 //3.載入配置檔案 22 Properties pro = new Properties(); 23 InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); 24 pro.load(is); 25 //4.獲取連線池物件 26 DataSource ds = DruidDataSourceFactory.createDataSource(pro); 27 //5.獲取連線 28 Connection conn = ds.getConnection(); 29 System.out.println(conn); 30 31 } 32 }
2. 定義工具類
(1)定義工具類 JDBCUtils
(2)提供靜態程式碼塊載入配置物件,初始化連線池物件
(3)提供方法:
1)獲取連線方法:通過資料庫連線池獲取連線
2)釋放資源
3)獲取連線池的方法
示例程式碼:JDBCUtils
1 package cn.itcast.datasource.utils; 2 3 import com.alibaba.druid.pool.DruidDataSourceFactory; 4 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.sql.Statement; 10 import java.util.Properties; 11 12 import javax.sql.DataSource; 13 14 /** 15 * Druid連線池工具類 16 */ 17 public class JDBCUtils { 18 //1.定義一個成員變數DataSource 19 private static DataSource ds; 20 21 static{ 22 23 try { 24 //1.載入配置檔案 25 Properties pro = new Properties(); 26 pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 27 //2.獲取DataSource 28 ds = DruidDataSourceFactory.createDataSource(pro); 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } 34 } 35 36 /** 37 * 獲取連線 38 * @return 39 * @throws SQLException 40 */ 41 public static Connection getConnection() throws SQLException { 42 return ds.getConnection(); 43 } 44 45 /** 46 * 釋放資源 47 * @param stmt 48 * @param conn 49 */ 50 public static void close(Statement stmt, Connection conn){ 51 if(stmt != null){ 52 try { 53 stmt.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 if(conn != null){ 59 try { 60 conn.close();//歸還連線 61 } catch (SQLException e) { 62 e.printStackTrace(); 63 } 64 } 65 } 66 67 /** 68 * 釋放資源 69 * @param rs 70 * @param stmt 71 * @param conn 72 */ 73 public static void close(ResultSet rs, Statement stmt, Connection conn){ 74 if(rs != null){ 75 try { 76 rs.close(); 77 } catch (SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 if(stmt != null){ 82 try { 83 stmt.close(); 84 } catch (SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88 if(conn != null){ 89 try { 90 conn.close();//歸還連線 91 } catch (SQLException e) { 92 e.printStackTrace(); 93 } 94 } 95 } 96 97 public static DataSource getDataSource(){ 98 return ds; 99 } 100 }
示例程式碼:DruidDemo2
package cn.itcast.datasource.druid; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import cn.itcast.datasource.utils.JDBCUtils; /** * 使用Druid工具類 */ public class DruidDemo2 { public static void main(String[] args) { /** * 完成一個新增的操作,給account表新增一條記錄 */ Connection conn = null; PreparedStatement pstmt = null; try { //1.獲取連線 conn = JDBCUtils.getConnection(); //2.定SQL String sql = "insert into account values(null, ?, ?)"; //3.獲取pstmt物件 pstmt = conn.prepareStatement(sql); //4.給?賦值 pstmt.setString(1,"王五"); pstmt.setDouble(2,3000); //5.執行SQL int count = pstmt.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); } finally{ JDBCUtils.close(pstmt,conn); } } }