21.JDBC開發(fā)(4)開源數(shù)據(jù)庫(kù)連接池(javaEE筆記)

一尸昧、開源數(shù)據(jù)庫(kù)連接池

  • 現(xiàn)在很多web服務(wù)器都提供了DataSource的實(shí)現(xiàn),即連接池的實(shí)現(xiàn)旷偿。通常我們把DataSource的實(shí)現(xiàn)按其英文含義稱為數(shù)據(jù)源烹俗,數(shù)據(jù)源中都包含了數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)。

  • 也有一些開源組織提供了數(shù)據(jù)源的獨(dú)立實(shí)現(xiàn):
    DBCP數(shù)據(jù)庫(kù)連接池
    C3P0數(shù)據(jù)庫(kù)連接池
    使用tomcat數(shù)據(jù)源

  • 實(shí)際應(yīng)用時(shí)不需要編寫連接數(shù)據(jù)庫(kù)代碼狸捅,直接從數(shù)據(jù)源獲得數(shù)據(jù)庫(kù)的連接。程序員編寫時(shí)也盡量使用這些數(shù)據(jù)源的實(shí)現(xiàn)累提,以提升程序的數(shù)據(jù)庫(kù)訪問(wèn)性能尘喝。

二、DBCP數(shù)據(jù)源(工程day16

  • DBCP是Apache軟件基金組織下的開源連接池實(shí)現(xiàn)斋陪,使用DBCP數(shù)據(jù)源朽褪,應(yīng)用程序應(yīng)在系統(tǒng)中增加如下兩個(gè)jar文件:
    commons-dbcp.jar:連接池的實(shí)現(xiàn)
    commons-pool.jar:連接池實(shí)現(xiàn)的依賴庫(kù)

  • tomcat的連接池正式采用該連接池來(lái)實(shí)現(xiàn)的。該數(shù)據(jù)庫(kù)連接池既可以與應(yīng)用服務(wù)器整合使用无虚,也可由應(yīng)用程序獨(dú)立使用缔赠。

使用此數(shù)據(jù)源需要一個(gè)配置文件:
dbcpconfig.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3305/day15
username=root
password=walp1314

#<!-- 初始化連接 -->
initialSize=10

#最大連接數(shù)量
maxActive=50

#<!-- 最大空閑連接 -->
maxIdle=20

#<!-- 最小空閑連接 -->
minIdle=5

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

#JDBC驅(qū)動(dòng)建立連接時(shí)附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] 
#注意:"user" 與 "password" 兩個(gè)屬性會(huì)被明確地傳遞,因此這里不需要包含他們友题。
connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由連接池所創(chuàng)建的連接的自動(dòng)提交(auto-commit)狀態(tài)嗤堰。
defaultAutoCommit=true

#driver default 指定由連接池所創(chuàng)建的連接的只讀(read-only)狀態(tài)。
#如果沒有設(shè)置該值度宦,則“setReadOnly”方法將不被調(diào)用踢匣。(某些驅(qū)動(dòng)并不支持只讀模式,如:Informix)
defaultReadOnly=

#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)戈抄。
#可用值為下列之一:(詳情可以看文檔)NONE,READ_UNCOMMITED,READ_COMMITED,REPEATABLE_READ,SERIALIZABLE
#但是注意:以上是mysql的隔離級(jí)別离唬,Oracle有些不同,Oracle最低要求READ_COMMITED
defaultTransactionIsolation=READ_UNCOMMITED

JdbcUtils_DBCP.java

package cn.itcast.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

public class JdbcUtils_DBCP {
    
    private static DataSource ds = null;
    static{
        try{
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);
            //先new一個(gè)工廠
            BasicDataSourceFactory factory = new BasicDataSourceFactory();
            //使用工廠生成數(shù)據(jù)源
            ds = factory.createDataSource(properties);
            System.out.println(ds);
        }catch(Exception e){
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    
    
    public static void release(Connection conn, Statement ps , ResultSet result){
        if(result != null){
            try {
                result.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            result = null;
        }
        if(ps != null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn != null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

說(shuō)明:這里我們可以使用之前的例子(如Demo1.java)進(jìn)行測(cè)試划鸽,但是當(dāng)我們使用的DBCP是版本1输莺,那么是可以測(cè)試成功的,但是如果用DBCP的版本2裸诽,那么會(huì)出現(xiàn)異常嫂用,此時(shí)我們需要再導(dǎo)入一個(gè)jar包:commons-logging-1.2.jar。這樣才能測(cè)試成功丈冬。

C3P0數(shù)據(jù)源(工程day16

首先需要導(dǎo)入相關(guān)的jar包:

c3p0-0.9.5.1.jar
mchange-commons-java-0.2.10.jar

使用此數(shù)據(jù)源需要的配置文件是:
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

    <!-- 如果在new的時(shí)候不指定使用哪個(gè)配置則使用下面缺省的配置  -->
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3305/day16</property>
    <property name="user">root</property>
    <property name="password">walp1314</property>
    <!-- 池里面的鏈接數(shù)量不夠的時(shí)候可以再找數(shù)據(jù)庫(kù)要多少個(gè)  -->
    <property name="acquireIncrement">5</property>
    <property name="initialPoolSize">10</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>
  </default-config>

  <!-- This app is massive! -->
  <named-config name="mysql"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
    <property name="user">root</property>
    <property name="password">walp1314</property>

    <property name="acquireIncrement">5</property><!--池里面的鏈接數(shù)量不夠的時(shí)候可以再找數(shù)據(jù)庫(kù)要多少個(gè)  -->
    <property name="initialPoolSize">10</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
   <!--  <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property> -->
  </named-config>
  
  <named-config name="oracle"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
    <property name="user">root</property>
    <property name="password">walp1314</property>

    <property name="acquireIncrement">5</property>
    <property name="initialPoolSize">10</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>

  </named-config>
</c3p0-config>

說(shuō)明:如果我們?cè)诤竺娉绦蛑腥绻恢付ㄊ褂媚膫€(gè)數(shù)據(jù)庫(kù)配置尸折,那么就使用默認(rèn)的配置。

JdbcUtils_C3P0.java

package cn.itcast.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils_C3P0 {
    
    private static ComboPooledDataSource ds = null;
    static{
        try{
            //使用配置文件時(shí)殷蛇,配置文件必須放在src下实夹,同時(shí)配置文件名不要改橄浓,如果不指定配置文件名,則使用默認(rèn)的配置
            ds = new ComboPooledDataSource("mysql");
        }catch(Exception e){
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    
    public static void release(Connection conn, Statement ps , ResultSet result){
        if(result != null){
            try {
                result.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            result = null;
        }
        if(ps != null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps = null;
        }
        if(conn != null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

說(shuō)明:我們也可以直接在程序中對(duì)其驅(qū)動(dòng)等信息進(jìn)行設(shè)置亮航,但是那樣太麻煩荸实,這里我們使用配置文件,如果不具體指定使用哪個(gè)配置缴淋,那就使用默認(rèn)配置准给。同樣我們可以使用之前的程序進(jìn)行測(cè)試。

四重抖、使用tomcat數(shù)據(jù)源(工程day16_web

我們可以在tomcat服務(wù)器中配置一個(gè)數(shù)據(jù)源露氮,這個(gè)數(shù)據(jù)源使用的JNDI技術(shù)。

所謂JNDI:

  • JNDI(java Naming and Directory Interface),java命名和目錄接口钟沛,它對(duì)應(yīng)于J2SE中的javax.naming包畔规。這套API的主要作用在于:它可以把java對(duì)象放在一個(gè)容器中(JNDI容器),并為容器中的java對(duì)象取一個(gè)名稱恨统,以后程序想獲得java對(duì)象叁扫,只需通過(guò)名稱檢索即可。
  • 其核心API為context畜埋,它代表JNDI容器莫绣,其lookup方法為檢索容器中對(duì)應(yīng)名稱的對(duì)象。

首先我們需要配置tomcat的Context悠鞍,配置Context可以有多種方式对室,這里我們使用一個(gè)配置文件放在META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password="walp1314"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3305/day16"
            maxTotal="8"
            maxIdle="4"/>
</Context>

ServletDemo1.java

package cn.itcast.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.dao.BaseDao;
//記得mysql的驅(qū)動(dòng)一定要加到tomcat的lib中
public class ServletDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        BaseDao dao = new BaseDao();
        dao.add();

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

BaseDao.java

package cn.itcast.dao;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BaseDao {
    
    public void add() {
        try {
            // 此時(shí)我們所有的程序都是在服務(wù)器中,在一般的類中我們也可以拿到數(shù)據(jù)庫(kù)鏈接
            Context initCtx = new InitialContext();// 初始化JNDI
            Context envCtx = (Context) initCtx.lookup("java:comp/env");// 得到JNDI容器
            DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");// 從容器中檢索一個(gè)鏈接池
            Connection conn = ds.getConnection();// 獲取到一個(gè)鏈接
            System.out.println(conn);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

說(shuō)明:這里一定注意要將mysql的jdbc驅(qū)動(dòng)放在tomcat的lib目錄中咖祭。

最后:其實(shí)還有一些開源的數(shù)據(jù)源可以使用软驰,比如阿里巴巴的數(shù)據(jù)源druid-1.0.19.jar,在以后的項(xiàng)目中可以使用心肪,而且其功能強(qiáng)大锭亏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硬鞍,隨后出現(xiàn)的幾起案子慧瘤,更是在濱河造成了極大的恐慌,老刑警劉巖固该,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锅减,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伐坏,警方通過(guò)查閱死者的電腦和手機(jī)怔匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人每瞒,你說(shuō)我怎么就攤上這事金闽。” “怎么了剿骨?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵代芜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我浓利,道長(zhǎng)挤庇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任贷掖,我火速辦了婚禮嫡秕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苹威。我一直安慰自己昆咽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布屠升。 她就那樣靜靜地躺著潮改,像睡著了一般狭郑。 火紅的嫁衣襯著肌膚如雪腹暖。 梳的紋絲不亂的頭發(fā)上舌界,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天芙扎,我揣著相機(jī)與錄音诊胞,去河邊找鬼横殴。 笑死齿税,一個(gè)胖子當(dāng)著我的面吹牛著觉,可吹牛的內(nèi)容都是我干的言疗。 我是一名探鬼主播诀艰,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雳锋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黄绩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玷过,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爽丹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辛蚊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粤蝎,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年袋马,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了初澎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虑凛,死狀恐怖碑宴,靈堂內(nèi)的尸體忽然破棺而出软啼,到底是詐尸還是另有隱情,我是刑警寧澤墓懂,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布焰宣,位于F島的核電站,受9級(jí)特大地震影響捕仔,放射性物質(zhì)發(fā)生泄漏匕积。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一榜跌、第九天 我趴在偏房一處隱蔽的房頂上張望闪唆。 院中可真熱鬧,春花似錦钓葫、人聲如沸悄蕾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帆调。三九已至,卻和暖如春豆同,著一層夾襖步出監(jiān)牢的瞬間番刊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工影锈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芹务,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓鸭廷,卻偏偏與公主長(zhǎng)得像枣抱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辆床,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評(píng)論 6 342
  • 本文包括傳統(tǒng)JDBC的缺點(diǎn)連接池原理自定義連接池開源數(shù)據(jù)庫(kù)連接池DBCP連接池C3P0連接池Tomcat內(nèi)置連接池...
    廖少少閱讀 16,745評(píng)論 0 37
  • 主要內(nèi)容 定義Spring的數(shù)據(jù)訪問(wèn)支持 配置數(shù)據(jù)庫(kù)資源 使用Spring提供的JDBC模板 寫在前面:經(jīng)過(guò)上一篇...
    程序熊大閱讀 8,767評(píng)論 1 31
  • 聲明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫佳晶,學(xué)員有權(quán)匿名,對(duì)文章有最終解釋權(quán)讼载;凱哥學(xué)堂旨在促進(jìn)VIP學(xué)員互...
    凱哥學(xué)堂閱讀 1,044評(píng)論 0 0
  • 文|九月流云 風(fēng)箏緣|總目錄 上一章|(27)路遇歹徒 (28)肖秋病了 當(dāng)肖秋洗完澡上床來(lái)的時(shí)候轿秧,袁麗掀開她的睡...
    九月流云閱讀 429評(píng)論 10 19