Java基礎-DBCP連接池(BasicDataSource類)詳解


          Java基礎-DBCP連接池(BasicDataSource類)詳解

                                 作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

 

  實際開發中“獲得連接”或“釋放資源”是非常消耗系統資源的兩個過程,為了解決此類性能問題,通常情況我們采用連接池技術,來共享連接Connection。這樣我們就不需要每次都創建連接、釋放連接了,這些操作都交給了連接池。

 

一.連接池概述

1>.什么是連接池

  用池來管理Connection,這樣可以重復使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection后,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。

2>.規范

  Java為數據庫連接池提供了公共的接口:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個接口。這樣應用程序可以方便的切換不同廠商的連接池!常見的連接池:DBCP、C3P0。本篇博客的主角是DBCP連接池。

 

 

二.DBCP連接池

  DBCP也是一個開源的連接池,是Apache Common成員之一,在企業開發中也比較常見,tomcat內置的連接池。如果我們想要使用它的功能的話,需要導入jar包,可以用Maven方式進行下載包,它可以幫我們解決一些依賴關系。Maven的使用請參考:http://www.cnblogs.com/yinzhengjie/p/9017416.html

1>.導入連接池jar包

2>.常見配置項

分類

屬性

描述

必須項

driverClassName

數據庫驅動名稱

url

數據庫的地址

username

用戶名

password

密碼

基本項(擴展)

maxActive

最大連接數量

minIdle

最小空閑連接

maxIdle

最大空閑連接

initialSize

初始化連接

  想要查看更詳細的信息可參考DBCP的官網:http://commons.apache.org/proper/commons-dbcp/configuration.html

 

三.BasicDataSource類的使用

1>.准備數據庫實驗環境

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 CREATE TABLE Teacher(
 8     id INT PRIMARY KEY AUTO_INCREMENT,
 9     Name varchar(30) COLLATE gbk_bin DEFAULT NULL,
10     Age int DEFAULT NULL,
11     Job varchar(50),
12     JobDescription varchar(100)
13 );

2>.代碼如下:

 1 #@author :yinzhengjie
 2 #Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 3 #EMAIL:y1053419035@qq.com
 4 #
 5 DriverName=com.mysql.jdbc.Driver
 6 url=jdbc:mysql://192.168.0.254:5200/yinzhengjie?useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
 7 username=root
 8 password=yinzhengjie
 9 initialSize=10
10 maxIdle=5
11 minIdle=3
12 maxActive=1
yinzhengjie.properties 文件內容
 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.note3;
 7 
 8 import javax.sql.DataSource;
 9 import org.apache.commons.dbcp.BasicDataSource;
10 import java.util.ResourceBundle;
11 
12 /**
13  *    在dbcp連接池的jar中,有 一個定義好的BasicDataSource累,通過查看源碼,發現該實現類已經幫我們實現類了數據源的規范接口,即javax.sql.DataSource
14  */
15 public class JDBCUtils {
16     
17     //創建DataSource接口的實現類對象(BasicDataSource),我們的dbcp工具包已經幫我們實現好了,咱們直接用就好!
18     private static BasicDataSource dataSource = new BasicDataSource();    
19     
20     //定義數據庫鏈接變量
21     private static final String DRIVERNAME;
22     private static final String URL;
23     private static final String USERNAME;
24     private static final String PASSWORD;
25     private static final int INITIALSIZE;
26     private static final int MAXIDLE;
27     private static final int MINLDEL;
28     private static final int MAXACTIVE;
29     
30     static {
31         //注意,我在Windows的配置文件全名是:“yinzhengjie.properties”,但是我們在給ResourceBundle的getBundle傳參時應該注意兩件事:第一,只傳遞文件名稱並不傳遞文件后綴(即:yinzhengjie),第二,該文件應該在classpath中或者是跟包名在同一路徑(即:在src目錄中)
32         DRIVERNAME = ResourceBundle.getBundle("yinzhengjie").getString("DriverName");
33         URL = ResourceBundle.getBundle("yinzhengjie").getString("url");
34         USERNAME = ResourceBundle.getBundle("yinzhengjie").getString("username");
35         PASSWORD = ResourceBundle.getBundle("yinzhengjie").getString("password");
36         INITIALSIZE = Integer.parseInt( ResourceBundle.getBundle("yinzhengjie").getString("initialSize"));
37         MAXIDLE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxIdle"));
38         MINLDEL = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("minIdle"));
39         MAXACTIVE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxActive"));
40     }
41     
42     //靜態代碼塊,對象BasicDataSource對象中的配置,自定義
43     static {
44         //鏈接數據庫的4個最基本信息,通過對象的set方法進行設置如下:
45         dataSource.setDriverClassName(DRIVERNAME);                    //設置數據庫驅動
46         dataSource.setUrl(URL);                                        //設置訪問數據庫的路徑
47         dataSource.setUsername(USERNAME);                            //設置登錄數據庫的用戶名
48         dataSource.setPassword(PASSWORD);                            //設置登錄數據庫的密碼
49         
50         //對象連接池中的常見配置項,以下的四個配置可以不配置(因為有默認配置),但是上面的四個是必須要配置的!
51         dataSource.setInitialSize(INITIALSIZE);            //指定初始化的連接數
52         dataSource.setMaxActive(MAXIDLE);                  //指定最大鏈接數量
53         dataSource.setMaxIdle(MINLDEL);                    //指定最大空閑數
54         dataSource.setMinIdle(MAXACTIVE);               //指定最小空閑數
55     }
56     
57     //定義靜態方法,返回BasicDataSource類的對象
58     public static DataSource getDataSource() {
59         return dataSource;
60     }
61 
62 }
JDBCUtils.java 文件內容
 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.note3;
 7 
 8 import java.sql.SQLException;
 9 import java.util.List;
10 import java.util.Map;
11 
12 import org.apache.commons.dbutils.QueryRunner;
13 import org.apache.commons.dbutils.handlers.ArrayListHandler;
14 import org.apache.commons.dbutils.handlers.MapListHandler;
15 
16 public class QueryRunnerDemo {
17     //定義兩個方法,實現數據表的添加,數據表查詢,QueryRunner類對象,寫在類成員位置
18     private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
19     
20     public static void main(String[] args) {
21 //        insert();
22         select();
23     }
24     
25     //數據表查詢
26     private static void select() {
27         String sql = "SELECT * FROM Teacher where name = ?";
28         try {
29             String FirstArgs = "尹正傑";
30             List<Map<String, Object>> list = qr.query(sql, new MapListHandler(), FirstArgs);
31             //遍歷集合list
32             for (Map<String, Object> map : list) {
33                 for(String key :map.keySet()){
34                     System.out.println(key + ": " + map.get(key) );
35                 }
36             }
37         } catch (SQLException e) {
38             System.out.println(e);
39             throw new RuntimeException("數據查詢失敗!");
40         }
41     }
42     
43     //數據表添加數據
44     private static void insert() {
45         String sql = "INSERT INTO Teacher VALUES(null,?,?,?,?)";
46         Object[] params = {"尹正傑",26,"高級雲計算工程師","負責網站架構維護,維護上萬台服務器正常運行!"};
47         
48         try {
49             int row = qr.update(sql,params);
50             if(row != 0) {
51                 System.out.println("添加成功");
52             }
53         } catch (SQLException e) {
54             e.printStackTrace();
55             throw new RuntimeException("數據添加失敗!");
56         }
57     }
58 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM