數(shù)據(jù)庫連接池

傳統(tǒng)的jdbc連接數(shù)據(jù)庫方式如下:
我們需要幾個步驟:注冊 JDBC 驅(qū)動程序注冊( Class.forName(DRIVER_NAME) ),通過DriverManager獲取物理連接拦宣。
一次數(shù)據(jù)庫訪問對應(yīng)一個物理連接,每次操作數(shù)據(jù)庫都要打開蜘欲、關(guān)閉該物理連接忆嗜。
添加mysql驅(qū)動包

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

jdbc操作類如下:

public class DBUtil {

    private static Logger logger = LoggerFactory.getLogger(DBUtil.class);
    private static String DRIVER_NAME = null;
    private static String URL = null;
    private static String USER_NAME = null;
    private static String PWD = null;

    private static Properties properties = new Properties();

    static {
        try {
            properties.load(DBUtil.class.getResourceAsStream("/jdbc.properties"));
        } catch (IOException e) {
            logger.error("系統(tǒng)加載jdbc.properties配置異常");
        }
        DRIVER_NAME = properties.getProperty("jdbc.driver");
        URL = properties.getProperty("jdbc.url");
        USER_NAME = properties.getProperty("jdbc.username");
        PWD = properties.getProperty("jdbc.password");
        try {
            Class.forName(DRIVER_NAME);
        } catch (ClassNotFoundException e) {
            logger.error("加載數(shù)據(jù)庫驅(qū)動異常");
        }
    }

    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(URL, USER_NAME, PWD);
        } catch (SQLException e) {
            logger.error("創(chuàng)建數(shù)據(jù)庫鏈接異常", e);
        }
        return connection;
    }

    public static void close(Connection connection) {
        if (connection != null) {
            try {
                if (!connection.isClosed()) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("連接關(guān)閉異常", e);
            }
        }
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                if (!resultSet.isClosed()) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                logger.error("結(jié)果集關(guān)閉異常", e);
            }
        }
        if (statement != null) {
            try {
                if (!statement.isClosed()) {
                    statement.close();
                }
            } catch (SQLException e) {
                logger.error("語句關(guān)閉異常", e);
            }
        }
        close(connection);
    }
}

我們采用DBCP(DataBase connection pool),數(shù)據(jù)庫連接池。DBCP是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。
添加dbcp依賴豪筝,對應(yīng)commons-pool和commons-dbcp兩個包

    <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

使用連接池,代碼如下:

public class DBCPUtil {

    private static Logger logger = LoggerFactory.getLogger(DBUtil.class);

    private static Properties properties = new Properties();

    private static DataSource dataSource;

    static {
        try {
            properties.load(DBCPUtil.class.getResourceAsStream("/jdbc.properties"));
        } catch (IOException e) {
            logger.error("系統(tǒng)加載jdbc.properties配置異常");
        }
        try {
            dataSource= BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            logger.error("加載數(shù)據(jù)庫驅(qū)動異常");
        }
//        dataSource=new BasicDataSource();
//        dataSource.setUsername("root");
//        dataSource.setPassword("root");
//        dataSource.setUrl("jdbc:mysql://localhost:3306/web");
//        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    }



    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection=dataSource.getConnection();
            connection.setAutoCommit(true);
        } catch (SQLException e) {
            logger.error("創(chuàng)建數(shù)據(jù)庫鏈接異常", e);
        }
        return connection;
    }

    public static void close(Connection connection) {
        if (connection != null) {
            try {
                if (!connection.isClosed()) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("連接關(guān)閉異常", e);
            }
        }
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                if (!resultSet.isClosed()) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                logger.error("結(jié)果集關(guān)閉異常", e);
            }
        }
        if (statement != null) {
            try {
                if (!statement.isClosed()) {
                    statement.close();
                }
            } catch (SQLException e) {
                logger.error("語句關(guān)閉異常", e);
            }
        }
        close(connection);
    }
}

注意properties的配置 和jdbc是不同的摘能。 我因為還用原來的配置壤蚜,報錯空指針,Cannot create JDBC driver of class '' for connect URL 'null' 徊哑,找了半天Bug

#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/web?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
#jdbc.username=root
#jdbc.password=root
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

JDBC的數(shù)據(jù)庫連接池使用javax.sql.DataSource來表示袜刷,DataSource只是一個接口,該接口通常由商用服務(wù)器等提供實現(xiàn)莺丑,也有一些開源組織提供實現(xiàn)(DBCP著蟹、C3P0)。
DataSource通常被稱為數(shù)據(jù)源梢莽,它包含連接池和連接池管理兩個部分萧豆,但習(xí)慣上也經(jīng)常把DataSource稱為連接池。

數(shù)據(jù)源連接池的方式連接數(shù)據(jù)庫是在程序中,通過向一個JNDI(Java Naming and Directory Interface)服務(wù)器查詢,即調(diào)用Context接口的lookup()方法,來得到DataSource對象,然后調(diào)用DataSource對象的getConnection()方法建立連接

在代碼中使用DriverManager獲得數(shù)據(jù)庫連接的方式中,客戶程序得到的連接對象是物理連接,調(diào)用連接對象的close()方法將關(guān)閉連接,而采用連接池技術(shù),客戶程序得到的連接對象是連接池中物理連接的一個句柄,調(diào)用連接對象的close()方法,物理連接并沒有關(guān)閉,數(shù)據(jù)源的實現(xiàn)只是刪除了客戶程序中的連接對象和池中的連接對象之間的聯(lián)系.

關(guān)于jndi昏名,可以參考:http://benweizhu.github.io/blog/2014/07/07/learning-jdbc-with-jndi/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涮雷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轻局,更是在濱河造成了極大的恐慌洪鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仑扑,死亡現(xiàn)場離奇詭異览爵,居然都是意外死亡,警方通過查閱死者的電腦和手機镇饮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門蜓竹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人储藐,你說我怎么就攤上這事俱济。” “怎么了钙勃?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵蛛碌,是天一觀的道長。 經(jīng)常有香客問我肺缕,道長左医,這世上最難降的妖魔是什么授帕? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮浮梢,結(jié)果婚禮上跛十,老公的妹妹穿的比我還像新娘。我一直安慰自己秕硝,他們只是感情好芥映,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著远豺,像睡著了一般奈偏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躯护,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天惊来,我揣著相機與錄音,去河邊找鬼棺滞。 笑死裁蚁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的继准。 我是一名探鬼主播枉证,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼移必!你這毒婦竟也來了室谚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤崔泵,失蹤者是張志新(化名)和其女友劉穎秒赤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體管削,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡倒脓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了含思。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘晤,死狀恐怖含潘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情线婚,我是刑警寧澤遏弱,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站塞弊,受9級特大地震影響漱逸,放射性物質(zhì)發(fā)生泄漏泪姨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一饰抒、第九天 我趴在偏房一處隱蔽的房頂上張望肮砾。 院中可真熱鬧,春花似錦袋坑、人聲如沸仗处。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婆誓。三九已至,卻和暖如春也颤,著一層夾襖步出監(jiān)牢的瞬間洋幻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工翅娶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鞋屈,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓故觅,卻偏偏與公主長得像厂庇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子输吏,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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

  • 聲明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫权旷,學(xué)員有權(quán)匿名,對文章有最終解釋權(quán)贯溅;凱哥學(xué)堂旨在促進VIP學(xué)員互...
    凱哥學(xué)堂閱讀 1,047評論 0 0
  • 1.JDBC介紹1.1 1.1 JDBC介紹 2.JDBC之API2.1 2.1 JDBC之API 3.JDBC例...
    拾壹北閱讀 1,191評論 0 7
  • 最原始的數(shù)據(jù)庫連接就是我們打開一個連接拄氯,使用過后再關(guān)閉該鏈接來釋放資源。頻繁的新建打開再關(guān)閉連接對jvm和數(shù)據(jù)庫都...
    野柳閱讀 6,380評論 1 11
  • DriverManager的實現(xiàn)方式一般是在主程序中建立數(shù)據(jù)庫的連接它浅,然后進行數(shù)據(jù)庫的操作译柏,操作完畢后斷開數(shù)據(jù)庫連...
    怪蜀黍Zzzzlw閱讀 2,039評論 0 9
  • 我聽到葉薰轉(zhuǎn)學(xué)的消息,去她家找她時姐霍,她家大門緊鎖鄙麦,已然人去樓空。 我那段時間找遍了與葉薰有關(guān)的人打探她的消息镊折,但苦...
    貓兒刺閱讀 248評論 5 1