鏈接池思想
在數據庫鏈接時,Connection資源很是珍貴,但又頻繁被使用,因此建立一個容器來專門管理這些鏈接
使用鏈接池實現Connection複用:
1.建立一個鏈接池對象
2.鏈接池對象生成並管理若干鏈接
(線程池中的線程是本身在線程池中使用線程,使用以後線程池將線程回收給後面的線程使用)
(鏈接池對象本身生成鏈接對象,咱們使用時直接從鏈接池獲得鏈接對象)(線程池是先使用線程,在交給線程池管理,一個是鏈接池先建立鏈接,在給使用)java
3.當與數據庫交互時,從鏈接池獲取鏈接
4.鏈接使用完,之前是直接釋放,如今直接存回鏈接池
5.存回鏈接池的目的是供下次使用
優勢:
A.實現Connection的複用
B.效率更高
Java中經常使用的數據庫鏈接池實現(管理程序與數據庫的鏈接)
C3p0 ----- 用xml配置文件規範
DBCP ----- 用properties配置文件規範
C3p0鏈接池使用
A:必須下載相關jar包
鏈接池管理鏈接的,必須還得導入mysql與java鏈接的jar包才能正常使用
B:建立鏈接池對象,傳入相關的配置信息(具體要使用哪種配置的鏈接池)
必須配置的四個配置項(驅動名,url,帳號,密碼)
可選配置項,鏈接的管理策略----初始化鏈接個數,最大鏈接數,空閒時的最小鏈接數......
C:從鏈接池對象取鏈接,並使用
D:將鏈接存回鏈接池
C3p0總結
1.導包
2.配置文件直接複製到src下面,注意必須在src下,且文件名不能修改
固定:c3p0-config.xml 由於解析原碼被底層封裝
3.建立鏈接池對象
DataSource ds = new ComboPooledDataSource();
底層實現:
A:自動讀取並解析配置文件
B:根據解析的數據建立若干鏈接
解析c3po-config.xml
用集合嵌套進行解析
Map<String(name-config的屬性),HashMap<String(property的屬性),String(property的文本)>>
內層HashMap中存的是,元素屬性值,元素文本值(鏈接池的具體配置信息)
外層Map中存儲的是具體使用哪一條配置信息來建立相應的鏈接池
4.獲取鏈接 使用
ds.getConnection(); 從鏈接池取出一個鏈接
5.鏈接用完以後存回鏈接池
con.close(); 這是使用的鏈接池重寫以後的Close方法,將鏈接放回,沒有釋放 其它使用的資源須要釋放
特色:資源複用,效率高,底層實現隱藏
C3p0解析配置文件時,配置文件中能夠有多套配置信息
default-config(默認配置,只能有一個)和named-config(命名配置,能夠0或多個)
使用方法:
DataSource ds = new ComboPooledDataSource; //默認配置
DataSource ds = new ComboPooledDataSource("配置文件中對應的name的值")
經常使用的配置最好放在xml的前面,由於xml解析存在效率問題
C3p0的配置也可使用編碼的方式完成,但由於是硬代碼,靈活性太差mysql
DBCP
A:導入jar包
B:建立鏈接池對象
1.導入配置文件
2.建立輸入流以及Properties集合,將數據讀入集合(經過類加載器中的方法直接讀src目錄下面的文件)
3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
C:獲取並使用鏈接
Connection con = ds.getConnection()
D:存回鏈接池
con.close()
抽取數據庫鏈接池工具類,不用每次都建立一個鏈接池sql
DBUtils:
和鏈接池一塊兒使用,封裝了一系列的「處理對象」處理和「結果」處理
JavaBean書寫規範
A:必須有包
B:必須實現序列化接口
C:屬性私有,提供公共的訪問方式
D:必須提供無參構造public
使用:
A:QueryRunner qr = new QueryRunner(數據庫鏈接池對象)
B:查詢操做
qr.query(參數1,參數2,參數3)
參數1 —— SQL語句
參數2 —— 結果集(須要的代理對象)
參數3 —— 補齊SQL語句的參數(佔位符的值)(底層使用預處理對象preparedStatement)
C:封裝鏈接返回線程池
實現細節:
1:QueryRunner 執行SQL語句時,會從數據庫鏈接池取出一個鏈接
使用完,本身將鏈接存回線程池
2:查詢時,query("SQL語句",new BeanListHandler<泛型>(反射對象),[佔位符參數])
此條代理對象返回的是一個List<JavaBean>集合,存儲每一條數據所對應的對象
BeanListHandler怎麼代理咱們執行的?
A:BeanListHandler 中的泛型決定了返回的集合的泛型
B:根據反射對象獲取無參構造,建立對象
C:取出表記錄中的字段名和字段值,利用反射和方法名拼接,爲對象賦值
D:將對象存入集合而後返回
代理對象:
BeanHandler 將單條記錄(多條記錄的狀況下,第一天記錄)組裝成JavaBean對象
ArrayHandler 將單條記錄(多條數據選取第一條)的每個字段值存儲進一個Object數據
ArrayListHandler 將每一條記錄的每個字段值存爲一個數組,將全部數組存進集合
ScalarHandler 查詢單個結果(聚合函數)
ColumanListHandler 將某一列的值存入一個集合
MapHandler 將第一條記錄的字段名做爲鍵,字段值做爲值存入一個Map集合
MapListHandler 將每一條記錄轉換成Map,再將Map存入List選一個值做爲Map集合所對應鍵,而後值爲其對應的Map字段名字段值集合
KeyedHandler 選一個值做爲Map集合所對應鍵,而後值爲其對應的Map字段名字段值集合
增刪改操做使用update方法,返回Long
Long line = qr.update(sql, params);數據庫
若是建立QueryRunner的時候沒有傳入鏈接詞對象數組
List<User> rs = qr.query(C3p0Utils.getDs().getConnection(), sql, new BeanListHandler<User>(User.class));緩存
池:
字符串常量池
包裝類緩存池
數據庫鏈接池
線程池
音樂池
資源複用,效率高函數