數據庫連接池——C3P0&Druid (一) 數據庫連接池
每一個事物都有其存在的意義,在初學jdbc的時候,我們建立數據庫連接對象后,會對其進行釋放,但是數據庫連接的建立和關閉是非常消耗資源的,而且頻繁的操作會使得性能變得低下,數據庫連接池可以幫我們解決這樣的問題(1) 概念
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
簡單理解:就是一個存放數據庫連接的容器,當用戶需要訪問數據庫的時候,容器提供連接對象給用戶用,之后用戶將連接對象歸還給容器
(2) 使用A:實現 javax.sql 包下的 DataSource 接口
方法:獲取連接:getConnection()
方法:歸還連接:Connection.close()
注意:在連接池中使用connection.close()方法,不代表關閉連接,代表歸還連接
B:我們可以使用一些開源的數據庫廠商提供的實現
C3P0
Druid (來自阿里巴巴)
(3) C3P0A:首先導入三個jar包 c3p0-0.9.5.2.jar 、mchange-commons-java-0.2.12.jar、數據庫驅動jar包
B:修改配置文件
C:創建數據庫連接池對象——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配置 //數據庫連接池對象 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()); } } //測試輸出日志及內容(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"); //執行sql int count = preparedStatement.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(preparedStatement,connection); } } }結尾:
如果內容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關注我吧!(系列文章均會在公眾號第一時間更新)
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創Java技術的公眾號:理想二旬不止
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75951.html
摘要:看過的一些書上也是多數介紹了這兩種數據庫連接池,自己做的也是使用。參考資料文檔首頁文檔問題阿里學習,號稱最好的數據庫連接池常用數據庫連接池配置說明學習整合,使用連接池使用和監控配置數據源配置如果文章有錯的地方歡迎指正,大家互相交流。 前言 本章節主要講解Druid數據庫連接池,為什么要學Druid數據庫連接池呢?? 我的知識儲備數據庫連接池有兩種->C3P0,DBCP,可是現在看起來并...
摘要:目前主流的數據庫連接池有等幾種。默認值初始化連接池中的連接數,取值應在與之間,默認為最大空閑時間秒內未使用則連接被丟棄。當連接池中的連接耗盡的時候一次同時獲取的連接數。每秒檢查所有連接池中的空閑連接。 一、數據庫連接池 數據庫連接池的基本思想就是為數據庫連接建立一個緩沖池,預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需要從緩沖池中取出一個,使用完之后在放回去,節省連接建...
閱讀 3517·2021-09-27 13:35
閱讀 3557·2019-08-29 17:09
閱讀 2426·2019-08-26 11:30
閱讀 698·2019-08-26 10:32
閱讀 532·2019-08-26 10:23
閱讀 1194·2019-08-26 10:20
閱讀 3150·2019-08-23 15:26
閱讀 3551·2019-08-23 14:33