day48-JDBC和連接池04( 二 )

c3p0方式一:5000次的連接耗時553ms

day48-JDBC和連接池04

文章插圖
10.3.2方式2-使用配置文件模板來完成首先如10.3.1一樣將jar包加入到項目中
然后將c3p0提供的配置文件c3p0-config.xml復制到src目錄下,該文件指定了連接數據庫和連接池的相關參數
c3p0-config.xml:
<c3p0-config><!--數據源的名稱 , 代表連接池,名字是隨意的--><named-config name="hello"><!-- 驅動類 --><property name="driverClass">com.mysql.jdbc.Driver</property><!-- url--><property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/hsp_db02</property><!-- 用戶名 --><property name="user">root</property><!-- 密碼 --><property name="password">123456</property><!-- 每次增長的連接數--><property name="acquireIncrement">5</property><!-- 初始的連接數 --><property name="initialPoolSize">10</property><!-- 最小連接數 --><property name="minPoolSize">5</property><!-- 最大連接數 --><property name="maxPoolSize">50</property><!-- 可連接的最多的命令對象數 --><property name="maxStatements">5</property><!-- 每個連接對象可連接的最多的命令對象數 --><property name="maxStatementsPerConnection">2</property></named-config></c3p0-config>測試程序:
package li.jdbc.datasource;import com.mchange.v2.c3p0.ComboPooledDataSource;import org.junit.Test;import java.sql.Connection;/** * 演示c3p0的使用 */public class C3P0_ {//方式2:使用配置文件模板來完成//將c3p0提供的配置文件c3p0-config.xml復制到src目錄下// 該文件指定了連接數據庫和連接池的相關參數@Testpublic void testC3P0_02() throws Exception {ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hello");//測試5000次連接誒mysqllong start = System.currentTimeMillis();System.out.println("開始執行...");for (int i = 0; i < 5000; i++) {Connection connection = comboPooledDataSource.getConnection();//System.out.println("連接成功");connection.close();}long end = System.currentTimeMillis();System.out.println("c3p0的第二種方式 5000次連接mysql 耗時=" + (end - start));}}c3p0的第二種方式 5000次連接mysql 耗時=533ms
day48-JDBC和連接池04

文章插圖
10.4德魯伊連接池首先將Druid的jar包復制到項目的lib文件夾中,點擊右鍵,選擇add as library
day48-JDBC和連接池04

文章插圖
jar包在該網站可以下載 Central Repository: com/alibaba/druid (maven.org)
然后將提供的配置文件的druid.properties(文件名可以隨意)復制到src目錄下
druid.properties:
#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/hsp_02?rewriteBatchedStatements=true#url=jdbc:mysql://localhost:3306/hsp_02username=rootpassword=123456#initial connection SizeinitialSize=10#min idle connecton sizeminIdle=5#max active connection sizemaxActive=50#max wait time (5000 mil seconds) 在等待隊列中的最大等待時間maxWait=5000測試程序:
package li.jdbc.datasource;import com.alibaba.druid.pool.DruidDataSourceFactory;import org.junit.Test;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.util.Properties;/** * 測試德魯伊Druid的使用 */public class Druid_ {@Testpublic void testDruid() throws Exception {//1.加入Druid包//2.加入配置文件 druid.properties,將該文件復制到項目的src目錄下面//3.創建Properties對象,讀取配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//4.創建一個指定參數的數據庫連接池,Druid連接池DataSource dataSource =DruidDataSourceFactory.createDataSource(properties);long start = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {Connection connection = dataSource.getConnection();//System.out.println("連接成功!");connection.close();}long end = System.currentTimeMillis();System.out.println("Druid連接池 操作5000次耗時="+(end-start));}}德魯伊連接池操作5000次的總耗時為434ms
day48-JDBC和連接池04

文章插圖
5000次連接池的時間和c3p0的時間差不多,但是當連接數量到50萬、500萬時差距就會很明顯,因此在實際開發中推薦使用Druid連接池 。
10.4.1德魯伊工具類將之前7.1的JDBCUtils工具類改為Druid(德魯伊)實現
通過德魯伊數據庫連接池獲取連接對象
工具類:JDBCUtilsByDruid
package li.jdbc.datasource;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * 基于Druid數據庫連接池的工具類 */public class JDBCUtilsByDruid {private static DataSource ds;//在靜態代碼塊完成ds的初始化//靜態代碼塊在加載類的時候只會執行一次 , 因此數據源也只會初始化一次static {Properties properties = new Properties();try {properties.load(new FileInputStream("src\\druid.properties"));ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//編寫getConnection方法public static Connection getConnection() throws SQLException {return ds.getConnection();}//關閉連接(注意:在數據庫連接池技術中 , close不是真的關閉連接,而是將Connection對象放回連接池中)public static void close(ResultSet resultSet, Statement statemenat, Connection connection) {try {if (resultSet != null) {resultSet.close();}if (statemenat != null) {statemenat.close();}if (connection != null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}

推薦閱讀