JDBC連接池


Java 為數(shù)據(jù)庫連接池提供了公共的接口:javax.sql.DataSource迷帜,各個(gè)廠商需要讓自

己的連接池實(shí)現(xiàn)這個(gè)接口音诫。這樣應(yīng)用程序可以方便的切換不同廠商的連接池!

常見的連接池:DBCP、 C3P0麸折。

接下來钠糊,我們就詳細(xì)的學(xué)習(xí)連接池挟秤。


c3p0 概述

C3P0 開源免費(fèi)的連接池!目前使用它的開源項(xiàng)目有:Spring抄伍、 Hibernate 等艘刚。使用第

三方工具需要導(dǎo)入 jar 包,c3p0 使用時(shí)還需要添加配置文件 c3p0-config.xml


一引入c3p0相關(guān)的jar包

c3p0-0.9.2-pre5.jar

mchange-commons-java-0.2.3.jar

下面是通過手動(dòng)來設(shè)置數(shù)據(jù)源:(后面講解如何從配置文件 c3p0-config.xml文件中來設(shè)置數(shù)據(jù)源)

package com.igeek_01_c3p0;

import java.sql.Connection;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**

*

* @ClassName: C3P0Demo_01

* @Description: TODO(C3P0 的基本配置)

* @date 2018 年 1 月 30 日 下午 1:44:42

* Company www.igeekhome.com

*

*/

public class C3P0Demo_01 {

@Test

public void demo01() throws Exception{

//1 獲得連接池(數(shù)據(jù)源)

ComboPooledDataSource dataSource = new ComboPooledDataSource();

//1.1 設(shè)置基本項(xiàng)

dataSource.setDriverClass("com.mysql.jdbc.Driver");

dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/igeek");

dataSource.setUser("root");

dataSource.setPassword("root");

//1.2 其他項(xiàng)

// * 初始化連接池中連接的個(gè)數(shù)

dataSource.setInitialPoolSize(5);

// * 最小|最大 連接池中連接的個(gè)數(shù)

dataSource.setMinPoolSize(2);

dataSource.setMaxPoolSize(10);

// * 最大空閑數(shù)

dataSource.setMaxIdleTime(60);

// * 每次增長個(gè)數(shù)

dataSource.setAcquireIncrement(2);

//2 獲得連接

Connection conn = dataSource.getConnection();

System.out.println(conn);

}

}


c3p0 連接池--配置文件使用

1.3.1配置項(xiàng)說明

配置文件名稱:c3p0-config.xml (格式固定)

配置文件位置:src (類路徑)

配置文件內(nèi)容:默認(rèn)配置

<c3p0-config>

<!-- 默認(rèn)配置 -->

<default-config>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/igeek</property>

<property name="user">root</property>

<property name="password">root</property>

<property name="checkoutTimeout">30000</property>

<property name="idleConnectionTestPeriod">30</property>

<property name="initialPoolSize">10</property>

<property name="maxIdleTime">30</property>

<property name="maxPoolSize">100</property>

<property name="minPoolSize">10</property>

<property name="maxStatements">200</property>

<user-overrides user="test-user">

<property name="maxPoolSize">10</property>

<property name="minPoolSize">1</property>

<property name="maxStatements">0</property>

</user-overrides>

</default-config>

</c3p0-config>

配置文件內(nèi)容:命名配置

屬于自定義截珍,可以根據(jù)情況修改相應(yīng)屬性攀甚;基本項(xiàng)必須要與自己的相應(yīng)屬性一致

<c3p0-config>

<named-config name="igeekhome">

<!-- 連接數(shù)據(jù)庫的4項(xiàng)基本參數(shù) -->

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/igeek</property>

<property name="user">root</property>

<property name="password">root</property>

<!-- 如果池中數(shù)據(jù)連接不夠時(shí)一次增長多少個(gè) -->

<property name="acquireIncrement">5</property>

<!-- 初始化連接數(shù) -->

<property name="initialPoolSize">20</property>

<!-- 最小連接受 -->

<property name="minPoolSize">10</property>

<!-- 最大連接數(shù) -->

<property name="maxPoolSize">40</property>

<!-- -JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量 -->

<property name="maxStatements">0</property>

<!-- 連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù) -->

<property name="maxStatementsPerConnection">5</property>

</named-config>

</c3p0-config>


代碼展示如何從配置文件中設(shè)置數(shù)據(jù)源:

package com.igeek_01_c3p0;

import java.sql.Connection;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**

*

* @ClassName: C3P0Demo_02

* @Description: TODO(使用 c3p0-config.xml 進(jìn)行 c3p0 的配置)

* @date 2018 年 1 月 30 日 下午 1:45:20

* Company www.igeekhome.com

*

*/

public class C3P0Demo_02 {

@Test

public void demo01() throws Exception {

// 1 獲得連接池(數(shù)據(jù)源)

// * c3p0 jar 包將自動(dòng)加載“ c3p0-config.xml”文件岗喉,并獲得具體的配置信息

// ** 在配置文件中 <named-config name="名稱"> 秋度,可以通過核心類 new

//ComboPooledDataSource("名稱")***注意這里named-config name="名稱"***

ComboPooledDataSource dataSource = new

ComboPooledDataSource("igeekhome");

// 2 獲得連接

Connection conn = dataSource.getConnection();

System.out.println(conn);

}

c3p0 連接池--工具類

C3P0 提供核心工具類:ComboPooledDataSource,如果要使用連接池钱床,必須創(chuàng)建該類的 實(shí)例對(duì)象静陈。 new ComboPooledDataSource(“ 名稱” ); 使用配置文件“命名配置” ? new ComboPooledDataSource(); 使用配置文件“默認(rèn)配置”

c3p0Utils.java代碼如下;

package com.igeek_01_c3p0;

import java.sql.Connection;

import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**

* @ClassName: C3P0Utils

* @Description: 等效 JdbcUtils,用于提供獲得連接工具類

* @date 2018年1月30日 下午1:56:50 Company www.igeekhome.com

*

*/

public class C3P0Utils {

// 連接池

private static ComboPooledDataSource dataSource = new

ComboPooledDataSource("igeekhome");

/**

* 獲得數(shù)據(jù)源(連接池)

*

* @return

*/

public static DataSource getDataSource() {

return dataSource;

}

/**

* 獲得連接

*

* @return

* @throws SQLException

*/

public static Connection getConnection() throws SQLException {

// 將從連接池中獲得連接

return dataSource.getConnection();

}

}

dbcp 連接池

dbcp 連接池--核心類:

DBCP 也是一個(gè)開源的連接池诞丽,是 Apache Common 成員之一鲸拥,在企業(yè)開發(fā)中也比較常見, tomcat 內(nèi)置的連接池

相關(guān)jar包

c3p0-0.9.2-pre5.jar

mchange-commons-java-0.2.3.jar

參考文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html

下面是通過手動(dòng)來設(shè)置數(shù)據(jù)源:(后面講解如何從配置文件*.properties 文件中來設(shè)置數(shù)據(jù)源)

package com.igeek_02_dbcp;

import java.sql.Connection;

import org.apache.commons.dbcp.BasicDataSource;

import org.junit.Test;

/**

* @ClassName: DBCPDemo_01

* @Description: DBCP的基本配置

* @date 2018年1月30日 下午2:01:42

* Company www.igeekhome.com

*

*/

public class DBCPDemo_01 {

@Test

public void demo01() throws Exception{

//1 獲得連接池

BasicDataSource dataSource = new BasicDataSource();

//1.1 基本項(xiàng)

dataSource.setDriverClassName("com.mysql.jdbc.Driver");

dataSource.setUrl("jdbc:mysql://localhost:3306/igeek");

dataSource.setUsername("root");

dataSource.setPassword("root");

//1.2 其他項(xiàng)

// * 初始化連接池中連個(gè)的個(gè)數(shù)

dataSource.setInitialSize(5);

// * 最大活勱數(shù)

dataSource.setMaxActive(10);

//2獲得連接

Connection conn = dataSource.getConnection();

System.out.println(conn);

}

}

dbcp 連接池--配置文件使用

配置文件名稱:*.properties

配置文件位置:任意僧免,建議 src(classpath/類路徑)

配置文件內(nèi)容:.properties文件 不能編寫中文刑赶,不支持在 STS 中修改,必須使用記事本修 改內(nèi)容懂衩,否則中文注釋就亂碼了? (一般用=連接key(左)撞叨,value(右))

#連接設(shè)置

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/webdb

username=root

password=root

#<!-- 初始化連接 -->

initialSize=10

#最大連接數(shù)量

maxActive=50

#<!-- 最大空閑連接 -->

maxIdle=20

#<!-- 最小空閑連接 -->

minIdle=5

#<!-- 超時(shí)等待時(shí)間以毫秒為單位 6000毫秒/1000等于60秒 -->

maxWait=60000

#JDBC驅(qū)勱建立連接時(shí)附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;]

#注意:"user" 不 "password" 兩個(gè)屬性會(huì)被明確地傳遞,因此這里丌需要包含他們浊洞。

connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由連接池所創(chuàng)建的連接的自勱提交(auto-commit)狀態(tài)牵敷。

defaultAutoCommit=true

#driver default 指定由連接池所創(chuàng)建的連接的叧讀(read-only)狀態(tài)。

#如果沒有設(shè)置該值法希,則“ setReadOnly”方法將丌被調(diào)用枷餐。(某些驅(qū)勱幵丌支持叧讀模式,如: Informix)

defaultReadOnly=

#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)苫亦。

#可用值為下列之一:(詳情可見javadoc毛肋。)NONE,READ_UNCOMMITTED, READ_COMMITTED,

REPEATABLE_READ, SERIALIZABLE

defaultTransactionIsolation=READ_UNCOMMITTED


案例:

package com.igeek_02_dbcp;

import java.io.InputStream;

import java.sql.Connection;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import org.junit.Test;

/**

* @ClassName: DBCPDemo_02

* @Description: 使用配置文件配置dbcp

* @date 2018年1月30日 下午2:11:33

* Company www.igeekhome.com

*

*/

public class DBCPDemo_02 {

@Test

public void demo01() throws Exception{

//1 獲得連接池

//1.1 加載properties文件怨咪,獲得Properties對(duì)象

InputStream is =

DBCPDemo_02.class.getClassLoader().getResourceAsStream("dbcp-config.properties");

Properties props = new Properties();

props.load(is);

//1.2獲得連接池

DataSource dataSource = BasicDataSourceFactory.createDataSource(props);

//2獲得連接

Connection conn = dataSource.getConnection();

System.out.println(conn);

}

}

dbcp-config.properties 配置文件

#基本配置內(nèi)容

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/igeek

username=root

password=root

initialSize=10

maxActive=50

maxIdle=20

minIdle=5

maxWait=60000

connectionProperties=useUnicode=true;characterEncoding=UTF-8

defaultAutoCommit=true

defaultReadOnly=NONE

defaultTransactionIsolation=READ_UNCOMMITTED

dbcp 連接池--工具類

工具類概述

工具類提供兩個(gè)功能,分別是提供連接池對(duì)象润匙,提供連接對(duì)象

案例:

package com.igeek_02_dbcp;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

/**

* @ClassName: DBCPUtils

* @Description: DBCP工具類

* @date 2018年1月30日 下午2:13:55

* Company www.igeekhome.com

*

*/

public class DBCPUtils {

//1 創(chuàng)建連接池

private static DataSource dataSource;

// * 編寫固定代碼

static{

try {

//1) 加載properties文件诗眨,獲得Properties對(duì)象

InputStream is =

DBCPUtils.class.getClassLoader().getResourceAsStream("dbcp-config.properties");

Properties prop = new Properties();

prop.load(is);

//2) 通過工廠,創(chuàng)建連接池

dataSource = BasicDataSourceFactory.createDataSource(prop);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

/**

* 獲得數(shù)據(jù)庫(連接池)

* @return

*/

public static DataSource getDataSource(){

return dataSource;

}

/**

* 獲得連接

* @return

* @throws SQLException

*/

public static Connection getConnection() throws SQLException{

return dataSource.getConnection();

}

}


DBUtils 工具類

概述

DBUtils 是 java 編程中的數(shù)據(jù)庫操作實(shí)用工具孕讳,小巧簡(jiǎn)單實(shí)用匠楚。 DBUtils 封裝了對(duì) JDBC 的操作,簡(jiǎn)化了 JDBC 操作厂财,可以少寫代碼芋簿。 Dbutils 三個(gè)核心功能介紹

QueryRunner 中提供對(duì) sql 詫句操作的 API.

ResultSetHandler 接口,用于定義 select 操作后蟀苛,怎樣封裝結(jié)果集.

DbUtils 類益咬,它就是一個(gè)工具類,定義了兲閉資源不事務(wù)處理的方法

要引入jar包c(diǎn)ommons-dbutils-1.6.jar



準(zhǔn)備數(shù)據(jù)

創(chuàng)建表:

create table product(

pid int primary key,

pname varchar(20),

price double,

category_id varchar(32)

);



插入數(shù)據(jù)

INSERT INTO product(pid,pname,price,category_id) VALUES(1,'IBM',5500,'c001');

INSERT INTO product(pid,pname,price,category_id) VALUES(2,'長城',3200,'c001');

INSERT INTO product(pid,pname,price,category_id) VALUES(3,'惠普',5000,'c001');

INSERT INTO product(pid,pname,price,category_id) VALUES(4,'華為',3800,'c002');

INSERT INTO product(pid,pname,price,category_id) VALUES(5,'小米',2000,'c002');

INSERT INTO product(pid,pname,price,category_id) VALUES(6,'OPPO',3400,'c002');

INSERT INTO product(pid,pname,price,category_id) VALUES(7,'NOKIA',2000,'c002');

INSERT INTO product(pid,pname,price,category_id) VALUES(8,'佰草集',800,'c003');

INSERT INTO product(pid,pname,price,category_id) VALUES(9,'玉蘭油',200,'c003');

INSERT INTO product(pid,pname,price,category_id) VALUES(10,'大寶',5,'c003');



QueryRunner 核心類介紹

構(gòu)造方法指定數(shù)據(jù)源逮诲,提供數(shù)據(jù)源DataSource

構(gòu)造方法

QueryRunner(DataSource) 創(chuàng)建核心類帜平, 并提供數(shù)據(jù)源, 內(nèi)部自己維護(hù)Connection

普通方法

update(String sql , Object ... params) 執(zhí)行 DML 語句

query(String sql , ResultSetHandler , Object ... params) 執(zhí)行 DQL 語句梅鹦,并將

查詢結(jié)果封裝到對(duì)象中裆甩。

構(gòu)造方法未指定數(shù)據(jù)源,在方法中提供連接

構(gòu)造方法

QueryRunner() 創(chuàng)建核心類齐唆,沒有提供數(shù)據(jù)源嗤栓,在進(jìn)行具體操作時(shí),需要手勱提

供 Connection

普通方法

update(Connection conn , String sql , Object ... params) 使用 提供的

Connection箍邮,完成 DML 語句

query(Connection conn , String sql , ResultSetHandler , Object ... params)

使用提供的 Connection茉帅,執(zhí)行 DQL 詫句,幵將查詢結(jié)果封裝到對(duì)象中锭弊。




ArrayHandler 將結(jié)果集中的第一條記彔封裝到一個(gè) Object[]數(shù)組中堪澎,數(shù)組中的每一個(gè)元素

就是這條記彔中的每一個(gè)字段的值

BeanHandler 將結(jié)果集中第一條記彔封裝到一個(gè)指定的 javaBean 中。

BeanListHandler 將結(jié)果集中每一條記彔封裝到指定的 javaBean 中味滞,將這些 javaBean 在封裝

到 List 集合中

ColumnListHandler 將結(jié)果集中指定的列的字段值樱蛤,封裝到一個(gè) List 集合中

KeyedHandler 將結(jié)果集中每一條記彔封裝到 Map<String,Object>,在將這個(gè) map 集合做

為另一個(gè) Map 的 value,另一個(gè) Map 集合的 key 是指定的字段的值。

MapHandler 將結(jié)果集中第一條記彔封裝到了 Map<String,Object>集合中剑鞍,key 就是字

段名稱昨凡,value 就是字段值

MapListHandler 將結(jié)果集中每一條記彔封裝到了 Map<String,Object>集合中,key 就是字

段名稱蚁署,value 就是字段值便脊,在將這些 Map 封裝到 List 集合中。

ScalarHandler 它是用于單數(shù)據(jù)光戈。例如 select count(*) from 表操作

注意:JavaBean

JavaBean 就是一個(gè)類就轧,在開發(fā)中常用詫封裝數(shù)據(jù)证杭。具有如下特性

1.需要實(shí)現(xiàn)接口:java.io.Serializable ,通常實(shí)現(xiàn)接口這步驟省略了妒御,不會(huì)影響程序解愤。

2. 提供私有字段:private 類型 字段名;

3. 提供 getter/setter 方法:

4. 提供無參構(gòu)造 ?



public class Product {

//字段名要與數(shù)據(jù)庫的字段名一致,不然有可能會(huì)取不到數(shù)據(jù)

private String pid;

private String pname;

private Double price;

private String category_id;

// 省略getter/setter方法

}

基本了解即可乎莉;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送讲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惋啃,更是在濱河造成了極大的恐慌哼鬓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件边灭,死亡現(xiàn)場(chǎng)離奇詭異异希,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绒瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門称簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰帽,你說我怎么就攤上這事憨降。” “怎么了该酗?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵授药,是天一觀的道長。 經(jīng)常有香客問我呜魄,道長悔叽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任爵嗅,我火速辦了婚禮娇澎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘操骡。我一直安慰自己九火,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布册招。 她就那樣靜靜地躺著岔激,像睡著了一般。 火紅的嫁衣襯著肌膚如雪是掰。 梳的紋絲不亂的頭發(fā)上虑鼎,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼炫彩。 笑死匾七,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的江兢。 我是一名探鬼主播昨忆,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杉允!你這毒婦竟也來了邑贴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤叔磷,失蹤者是張志新(化名)和其女友劉穎拢驾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體改基,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡繁疤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秕狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稠腊。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖封恰,靈堂內(nèi)的尸體忽然破棺而出麻养,到底是詐尸還是另有隱情褐啡,我是刑警寧澤诺舔,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站备畦,受9級(jí)特大地震影響低飒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懂盐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一褥赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莉恼,春花似錦拌喉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捶惜,卻和暖如春田藐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工汽久, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹤竭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓景醇,卻偏偏與公主長得像臀稚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子三痰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容