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

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 }
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 }