數(shù)據(jù)庫連接池——C3P0&Druid (一) 數(shù)據(jù)庫連接池
每一個事物都有其存在的意義,在初學(xué)jdbc的時候,我們建立數(shù)據(jù)庫連接對象后,會對其進行釋放,但是數(shù)據(jù)庫連接的建立和關(guān)閉是非常消耗資源的,而且頻繁的操作會使得性能變得低下,數(shù)據(jù)庫連接池可以幫我們解決這樣的問題(1) 概念
數(shù)據(jù)庫連接池負責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
簡單理解:就是一個存放數(shù)據(jù)庫連接的容器,當(dāng)用戶需要訪問數(shù)據(jù)庫的時候,容器提供連接對象給用戶用,之后用戶將連接對象歸還給容器
(2) 使用A:實現(xiàn) javax.sql 包下的 DataSource 接口
方法:獲取連接:getConnection()
方法:歸還連接:Connection.close()
注意:在連接池中使用connection.close()方法,不代表關(guān)閉連接,代表歸還連接
B:我們可以使用一些開源的數(shù)據(jù)庫廠商提供的實現(xiàn)
C3P0
Druid (來自阿里巴巴)
(3) C3P0A:首先導(dǎo)入三個jar包 c3p0-0.9.5.2.jar 、mchange-commons-java-0.2.12.jar、數(shù)據(jù)庫驅(qū)動jar包
B:修改配置文件
C:創(chuàng)建數(shù)據(jù)庫連接池對象——ComboPooledDataSource()
D:獲取連接——getConnection()
package cn.ideal.datasource.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Demo { private static DataSource comboPooledDataSource = null; static{ //不指定則使用默認XML配置 //數(shù)據(jù)庫連接池對象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); } public static Connection getConnection() throws SQLException { //獲取連接 return comboPooledDataSource.getConnection(); } public static void main(String[] args) throws SQLException { System.out.println(getConnection()); } } //測試輸出日志及內(nèi)容(4) Druid
package cn.ideal.datasource.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; public class DruidDemo { public static void main(String[] args) throws Exception { //加載配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //獲取連接池對象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); //獲取連接 Connection connection =ds.getConnection(); System.out.println(connection); } }
試著用Druid寫一個工具類
package cn.ideal.datasource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtils { private static DataSource ds = null; static { //加載配置文件 Properties properties = new Properties(); try { properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); ds = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取連接 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 釋放資源 */ public static void close(Statement statement, Connection connection) { close(null, statement, connection); } public static void close(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
工具類測試
package cn.ideal.datasource.test; import cn.ideal.datasource.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class JDBCUtilsTest { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; try { //獲取連接 connection = JDBCUtils.getConnection(); //定義sql String sql = "INSERT INTO account VALUES(NULL,?,?)"; //獲取preparedStatement對象 preparedStatement = connection.prepareStatement(sql); //給?賦值 preparedStatement.setString(1, "lisi"); preparedStatement.setString(2, "2000"); //執(zhí)行sql int count = preparedStatement.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(preparedStatement,connection); } } }結(jié)尾:
如果內(nèi)容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關(guān)注我吧?。ㄏ盗形恼戮鶗诠娞柕谝粫r間更新)
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創(chuàng)Java技術(shù)的公眾號:理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75951.html
摘要:看過的一些書上也是多數(shù)介紹了這兩種數(shù)據(jù)庫連接池,自己做的也是使用。參考資料文檔首頁文檔問題阿里學(xué)習(xí),號稱最好的數(shù)據(jù)庫連接池常用數(shù)據(jù)庫連接池配置說明學(xué)習(xí)整合,使用連接池使用和監(jiān)控配置數(shù)據(jù)源配置如果文章有錯的地方歡迎指正,大家互相交流。 前言 本章節(jié)主要講解Druid數(shù)據(jù)庫連接池,為什么要學(xué)Druid數(shù)據(jù)庫連接池呢?? 我的知識儲備數(shù)據(jù)庫連接池有兩種->C3P0,DBCP,可是現(xiàn)在看起來并...
摘要:目前主流的數(shù)據(jù)庫連接池有等幾種。默認值初始化連接池中的連接數(shù),取值應(yīng)在與之間,默認為最大空閑時間秒內(nèi)未使用則連接被丟棄。當(dāng)連接池中的連接耗盡的時候一次同時獲取的連接數(shù)。每秒檢查所有連接池中的空閑連接。 一、數(shù)據(jù)庫連接池 數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個緩沖池,預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需要從緩沖池中取出一個,使用完之后在放回去,節(jié)省連接建...
摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。 一、數(shù)據(jù)庫連接池的原理 基本原理 對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時可以簡單地在需要訪問數(shù)據(jù)庫時,就新創(chuàng)建一個連接,用完后就關(guān)閉它,這樣做也...
摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。 一、數(shù)據(jù)庫連接池的原理 基本原理 對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時可以簡單地在需要訪問數(shù)據(jù)庫時,就新創(chuàng)建一個連接,用完后就關(guān)閉它,這樣做也...
閱讀 3532·2021-09-27 13:35
閱讀 3571·2019-08-29 17:09
閱讀 2450·2019-08-26 11:30
閱讀 711·2019-08-26 10:32
閱讀 545·2019-08-26 10:23
閱讀 1206·2019-08-26 10:20
閱讀 3161·2019-08-23 15:26
閱讀 3571·2019-08-23 14:33