java通過dbcp實現(xiàn)一個數(shù)據(jù)庫連接池

前言

對于spring項目,如果需要用到多數(shù)據(jù)源状答,可以直接在spirng配置多個數(shù)據(jù)源粉洼,但是這種方法比較麻煩,特別是項目整合了mybatis的情況仅财,如果我們只需要很簡單地訪問另外一個數(shù)據(jù)庫狈究,我們完全可以通過dbcp實現(xiàn)一個簡單的連接池即可。

實現(xiàn)

一開始盏求,我們可以用純粹的jdbc來連接數(shù)據(jù)庫谦炒,但是這樣,我們每次訪問數(shù)據(jù)庫风喇,都需要開啟連接和關(guān)閉連接宁改,非常浪費(fèi)資源,因此魂莫,我們可以實現(xiàn)一個簡單的連接池还蹲,用于減少這部分資源的開銷。并且耙考,我們不需要自己實現(xiàn)連接池的功能谜喊,各大廠商都已經(jīng)為我們提供了連接池的實現(xiàn),例如C3P0倦始、DBCP連接池等斗遏,我們只需在這基礎(chǔ)上二次開發(fā)即可,這里鞋邑,我們選用DBCP來實現(xiàn)我們的連接池功能诵次。

  • pom.xml配置
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
  • config.properties配置連接屬性
#other database
other.jdbc.driver=com.mysql.jdbc.Driver
other.jdbc.url=jdbc:mysql://localhost:3306/spring_test?useUnicode=true&characterEncoding=utf-8
other.jdbc.user=root
other.jdbc.password=root
other.initSize=1
other.maxAtive=8
other.maxWait=60000
other.maxIdle=6
other.minIdle=2
  • 連接池工具類

這里使用了ThreadLocal類账蓉,主要是通過該類實現(xiàn)同步效果,防止多線程下該連接池失效逾一。

public class DbUtil {

    private static final Logger log = LoggerFactory.getLogger(DbUtil.class);

    /**
     *  數(shù)據(jù)庫連接池
     */
    private static BasicDataSource dbcp;

    /**
     *  為不同線程管理連接
     */
    private static ThreadLocal<Connection> threadLocal;

    static {
        try {
            dbcp = new BasicDataSource();
            dbcp.setDriverClassName(PropertyUtil.getProperty("config", "other.jdbc.driver"));
            dbcp.setUrl(PropertyUtil.getProperty("config", "other.jdbc.url"));
            dbcp.setUsername(PropertyUtil.getProperty("config", "other.jdbc.user"));
            dbcp.setPassword(PropertyUtil.getProperty("config", "other.jdbc.password"));
            // 初始化
            dbcp.setInitialSize(Integer.parseInt(PropertyUtil.getProperty("config", "other.initSize")));
            // 最大連接數(shù)
            dbcp.setMaxActive(Integer.parseInt(PropertyUtil.getProperty("config", "other.maxAtive")));
            // 最大等待時間
            dbcp.setMaxWait(Long.parseLong(PropertyUtil.getProperty("config", "other.maxWait")));
            // 最大空閑數(shù)
            dbcp.setMaxIdle(Integer.parseInt(PropertyUtil.getProperty("config", "other.maxIdle")));
            // 最小空閑數(shù)
            dbcp.setMinIdle(Integer.parseInt(PropertyUtil.getProperty("config", "other.minIdle")));

            threadLocal = new ThreadLocal<>();

        } catch (Exception e) {
            log.error("DbUtil exception",e);
        }
    }

    /**
     * 獲取一個連接
     * @return
     */
    public static Connection getConnection() {
        try {
            Connection connection = dbcp.getConnection();
            connection.setAutoCommit(false);
            threadLocal.set(connection);
            return connection;
        } catch (Exception e) {
            log.error("getConnection exception",e);
            return null;
        }
    }

    /**
     * 歸還一個連接
     */
    public static void closeConnection() {
        try {
            Connection connection = threadLocal.get();
            if(connection != null) {
                // 實際上沒有關(guān)閉連接铸本,只是放在池子里
                connection.close();
                threadLocal.remove();
            }
        } catch (Exception e) {
            log.error("closeConnection exception",e);
        }

    }
}
  • 利用junit來進(jìn)行測試
@Test
public void testDbUtil(){
    String sql = "select * from study_login";
    Connection connection = DbUtil.getConnection();
    try{
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println(resultSet.getInt(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
        }
    }catch (Exception e){
        logger.error("testDbUtil exception", e);
    }


}

源碼

詳細(xì)代碼請參考github的DbUtil.java

https://github.com/wumingzhizhu/springTest

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遵堵,隨后出現(xiàn)的幾起案子箱玷,更是在濱河造成了極大的恐慌,老刑警劉巖陌宿,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锡足,死亡現(xiàn)場離奇詭異,居然都是意外死亡壳坪,警方通過查閱死者的電腦和手機(jī)舶得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥虐,“玉大人扩灯,你說我怎么就攤上這事媚赖∷瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵惧磺,是天一觀的道長颖对。 經(jīng)常有香客問我,道長磨隘,這世上最難降的妖魔是什么缤底? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮番捂,結(jié)果婚禮上个唧,老公的妹妹穿的比我還像新娘。我一直安慰自己设预,他們只是感情好徙歼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳖枕,像睡著了一般魄梯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宾符,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天酿秸,我揣著相機(jī)與錄音,去河邊找鬼魏烫。 笑死辣苏,一個胖子當(dāng)著我的面吹牛肝箱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播考润,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼狭园,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糊治?” 一聲冷哼從身側(cè)響起唱矛,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎井辜,沒想到半個月后绎谦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粥脚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年窃肠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷允。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡冤留,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树灶,到底是詐尸還是另有隱情纤怒,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布天通,位于F島的核電站泊窘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏像寒。R本人自食惡果不足惜烘豹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诺祸。 院中可真熱鬧携悯,春花似錦、人聲如沸筷笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奥秆。三九已至逊彭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間构订,已是汗流浹背侮叮。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悼瘾,地道東北人囊榜。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓审胸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卸勺。 傳聞我的和親對象是個殘疾皇子砂沛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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