一、數據庫連接池
1、連接池概念
連接池其實就是一個容器(集合),存放數據庫連接的容器。
當系統初始化好后,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問之后,會將連接對象歸還給容器
2、連接池好處
① 節約資源(不必沒連接一次數據都去創建一個 Connection 對象)
② 用戶訪問高效(每次連接只需要從數據庫連接池中獲取連接即可,不用等待連接數據庫的漫長過程)
3、實現
(1)標准接口:DataSource 在 javax.sql 包下
常用方法:
獲取連接:getConnection()
歸還連接:Connection.close()。如果連接對象
Connection 是從連接池中獲取的,那么調用 Connection.close() 方法,則不會再關閉連接了,而是歸還連接。
(2)接口的實現,一般不需要我們去實現,有數據庫廠商來實現
① C3P0:數據庫連接池技術
② Druid:數據庫連接池技術,由阿里巴巴提供
二、C3P0 連接池
1、C3P0 數據庫連接池技術實現步驟
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()
代碼實現:
1 public static void main(String[] args) throws SQLException { 2 // 創建數據庫連接對象
3 DataSource ds = new ComboPooledDataSource(); // 會自動去加載配置文件 4
5 //獲取連接對象
6 Connection conn = ds.getConnection(); 7
8 // 打印連接對象
9 System.out.println(conn); 10
11 // 歸還對象
12 conn.close(); 13 }
2、導入的 jar 包
3、配置文件
c3p0-config.xml 配置文件
1 <c3p0-config>
2 <!-- 使用默認的配置讀取連接池對象 -->
3 <default-config>
4 <!-- 連接參數 -->
5 <property name="driverClass">com.mysql.jdbc.Driver</property>
6 <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
7 <property name="user">root</property>
8 <property name="password">root</property>
9
10 <!-- 連接池參數 -->
11 <!--初始化連接的數量-->
12 <property name="initialPoolSize">5</property>
13 <!--最大的連接數量-->
14 <property name="maxPoolSize">10</property>
15 <!--超時時間-->
16 <property name="checkoutTimeout">3000</property>
17 </default-config>
18
19 <!--通過指定的名字來獲取連接的數據庫-->
20 <named-config name="otherc3p0">
21 <!-- 連接參數 -->
22 <property name="driverClass">com.mysql.jdbc.Driver</property>
23 <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
24 <property name="user">root</property>
25 <property name="password">root</property>
26
27 <!-- 連接池參數 -->
28 <property name="initialPoolSize">5</property>
29 <property name="maxPoolSize">8</property>
30 <property name="checkoutTimeout">1000</property>
31 </named-config>
32 </c3p0-config>
注意:在配置文件中可以連接多個不同的數據庫,用<name-config> 聲明即可,到時候使用 name 屬性來調用即可,如果沒有指定 name,那么調用默認的數據庫。
Demo:
1 public static void main(String[] args) throws SQLException { 2 // 創建數據庫連接對象 3 //DataSource ds = new ComboPooledDataSource(""); //連接默認的數據庫
4 DataSource ds = new ComboPooledDataSource("otherc3p0"); //連接 name=otherc3p0數據庫 5
6 //2 獲取連接
7 Connection conn = ds.getConnection(); 8
9 Statement stmt = conn.createStatement(); 10
11 // 3.歸還連接
12 conn.close(); 13
14 }
三、Druid 連接池
1、Druid 數據庫連接池技術實現步驟
1. 導入 jar 包druid-1.0.9.jar
2. 定義配置文件
名稱:是properties 形式的,需要手動加載
路徑:可以放在任意目錄下(建議放在src目錄下)
3. 加載配置文件 properties
4. 獲取數據連接池對象:通過工廠來獲取 DruidDataSourceFactory
5. 獲取連接:getConnection
6. 歸還連接:close()
代碼實現:
1 public class DruidDemo1 { 2 public static void main(String[] args) throws Exception { 3 //1.導入jar包 4 //2.定義配置文件 5
6 //3.加載配置文件
7 Properties prop = new Properties(); 8 InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"); 9 prop.load(is); 10
11 //4.獲取連接池對象
12 DataSource ds = DruidDataSourceFactory.createDataSource(prop); 13
14
15 //5.獲取連接
16 Connection conn = ds.getConnection(); 17 System.out.println(conn); 18
19 // 6.歸還連接
20 conn.close(); 21 } 22 }
2、導入 jar 包
3、配置文件
druid.properties 文件
1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc:mysql://127.0.0.1:3306/bookstore
3 username=root 4 password=root 5 # 初始化連接數量 6 initialSize=5
7 # 最大連接數 8 maxActive=10
9 # 延遲時間 10 maxWait=3000
4、Druid 連接池的工具類
可以將數據庫連接池封裝成一個工具類,這樣在獲取的連接的時候,直接拿來用即可,不用再創建連接池,更加方便。
1 import com.alibaba.druid.pool.DruidDataSourceFactory; 2
3 import javax.sql.DataSource; 4 import java.io.IOException; 5 import java.sql.Connection; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 import java.util.Properties; 10
11 /**
12 * Druid 連接池的工具類 13 */
14 public class JDBCUtils { 15
16 // 1.定義成員變量
17 private static DataSource ds; 18
19 static { 20 //加載配置文件
21 Properties pro = new Properties(); 22 try { 23 pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 24 // 2 獲取datasource
25 ds = DruidDataSourceFactory.createDataSource(pro); 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } 31
32 } 33
34 /**
35 * 獲取連接 36 */
37 public static Connection getConnection() throws SQLException { 38 return ds.getConnection(); 39 } 40
41 /**
42 * 釋放資源 43 */
44 public static void close(Statement stmt, Connection conn) { 45 if (stmt != null) { 46 try { 47 stmt.close(); 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 } 51 } 52 if (conn != null) { 53 try { 54 stmt.close(); 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 } 58 } 59 } 60
61 public static void close(ResultSet rs, Statement stmt, Connection conn) { 62 if (rs != null) { 63 try { 64 rs.close(); 65 } catch (SQLException e) { 66 e.printStackTrace(); 67 } 68 } 69 if (stmt != null) { 70 try { 71 stmt.close(); 72 } catch (SQLException e) { 73 e.printStackTrace(); 74 } 75 } 76 if (conn != null) { 77 try { 78 conn.close(); 79 } catch (SQLException e) { 80 e.printStackTrace(); 81 } 82 } 83 } 84
85 /**
86 * 獲取連接池方法 87 */
88 public static DataSource getDataSource() { 89 return ds; 90 } 91 }