連接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool對比測試


這次所要做的測試是比較幾種我們常用的數據庫連接池的性能,他們分別是:c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool這四種,測試將采用統一的參數配置力求比較“公平”的體現統一水平下幾種連接池的不同。

        1.創建類TestDAO,封裝統一的查詢方法 :

import java.sql.Connection;
import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestDAO { private final static String sql = "SELECT * FROM USER u WHERE u.USR_ID=9999"; public void query(Connection conn) { try { Statement st = conn.createStatement(); ResultSet result = st.executeQuery(sql); result.close(); st.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

        2.創建測試類TestMain,其中包含:統一參數配置屬性、獲取各種連接池數據源方法、各種數據源調用方法等,代碼較長但不難理解:

import java.beans.PropertyVetoException;
import java.io.IOException; import java.sql.SQLException; import org.apache.tomcat.jdbc.pool.DataSource; import org.logicalcobwebs.proxool.ProxoolDataSource; import com.alibaba.druid.pool.DruidDataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class TestMain { // 數據庫驅動名稱 static String driver = "com.mysql.jdbc.Driver"; // 數據庫連接地址 static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 數據庫用戶名 static String user = "dba"; // 數據庫密碼 static String passwd = "123456"; // 連接池初始化大小 static int initialSize = 5; // 連接池最小空閑 static int minPoolSize = 10; // 連接池最大連接數量 static int maxPoolSize = 50; // 最小逐出時間,100秒 static int maxIdleTime = 100000; // 連接失敗重試次數 static int retryAttempts = 10; // 當連接池連接耗盡時獲取連接數 static int acquireIncrement = 5; // c3p0數據源 static ComboPooledDataSource c3p0DataSource = getC3p0DataSource(); // Druid數據源 static DruidDataSource druidDataSource = getDruidDataSource(); // Proxool數據源 static ProxoolDataSource proxoolDataSource = getProxoolDataSource(); // Tomcat Jdbc Pool數據源 static DataSource tomcatDataSource = getTomcatDataSource(); /** * 測試方式: 每種數據源配置信息盡量相同,以求結果更加准確 * 每種數據源做10次、100次、500次、1000次、2000次、4000次、8000次查詢操作 每種查詢重復100次,查看100次執行時間的波動圖 * @param args * @throws IOException * @throws SQLException */ public static void main(String[] args) throws IOException, SQLException { TestDAO testDAO = new TestDAO(); // 查詢次數 int count = 10; System.out.println("查詢次數為:" + count); System.out.println(); System.out.println("==========================c3p0 測試開始=========================="); // 測試c3p0 for (int i = 0; i < 100; i++) { queryC3p0(testDAO, c3p0DataSource, count); } System.out.println("==========================c3p0 測試結束=========================="); System.out.println(); System.out.println("==========================Proxool 測試開始=========================="); // 測試Proxool for (int i = 0; i < 100; i++) { queryProxxool(testDAO, proxoolDataSource, count); } System.out.println("==========================Proxool 測試結束=========================="); System.out.println(); System.out.println("==========================Druid 測試開始=========================="); // 測試Druid for (int i = 0; i < 100; i++) { queryDruid(testDAO, druidDataSource, count); } System.out.println("==========================Druid 測試結束=========================="); System.out.println(); System.out.println("==========================Tomcat Jdbc Pool 測試開始=========================="); // 測試Tomcat Jdbc Pool for (int i = 0; i < 100; i++) { queryTomcatJDBC(testDAO, tomcatDataSource, count); } System.out.println("==========================Tomcat Jdbc Pool 測試結束=========================="); } /** * c3p0測試 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryC3p0(TestDAO testDAO, ComboPooledDataSource ds, int count) throws SQLException { // 查詢10次以初始化連接池 for (int i = 0; i < 10; i++) { testDAO.query(ds.getConnection()); } // 開始時間 long startMillis = System.currentTimeMillis(); // 循環查詢 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 結束時間 long endMillis = System.currentTimeMillis(); // 輸出結束時間 System.out.println(endMillis - startMillis); } /** * Proxxool測試 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryProxxool(TestDAO testDAO, ProxoolDataSource ds, int count) throws SQLException { // 查詢10次以初始化連接池 for (int i = 0; i < 10; i++) { testDAO.query(ds.getConnection()); } // 開始時間 long startMillis = System.currentTimeMillis(); // 循環查詢 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 結束時間 long endMillis = System.currentTimeMillis(); // 輸出結束時間 System.out.println(endMillis - startMillis); } /** * Druid測試 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryDruid(TestDAO testDAO, DruidDataSource ds, int count) throws SQLException { // 查詢10次以初始化連接池 for (int i = 0; i < 10; i++) { testDAO.query(ds.getConnection()); } // 開始時間 long startMillis = System.currentTimeMillis(); // 循環查詢 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 結束時間 long endMillis = System.currentTimeMillis(); // 輸出結束時間 System.out.println(endMillis - startMillis); } /** * Tomcat Jdbc Pool測試 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryTomcatJDBC(TestDAO testDAO, DataSource ds, int count) throws SQLException { // 查詢10次以初始化連接池 for (int i = 0; i < 10; i++) { testDAO.query(ds.getConnection()); } // 開始時間 long startMillis = System.currentTimeMillis(); // 循環查詢 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 結束時間 long endMillis = System.currentTimeMillis(); // 輸出結束時間 System.out.println(endMillis - startMillis); } /** * 獲取c3p0數據源 * @throws PropertyVetoException */ public static ComboPooledDataSource getC3p0DataSource() { // 設置參數 ComboPooledDataSource cpds = new ComboPooledDataSource(); try { cpds.setDriverClass(driver); } catch (PropertyVetoException e) { e.printStackTrace(); } cpds.setJdbcUrl(jdbcUrl); cpds.setUser(user); cpds.setPassword(passwd); cpds.setInitialPoolSize(initialSize); cpds.setMinPoolSize(minPoolSize); cpds.setMaxPoolSize(maxPoolSize); cpds.setMaxIdleTime(maxIdleTime); cpds.setAcquireRetryAttempts(retryAttempts); cpds.setAcquireIncrement(acquireIncrement); cpds.setTestConnectionOnCheckin(false); cpds.setTestConnectionOnCheckout(false); return cpds; } /** * 獲取Druid數據源 * @return */ public static DruidDataSource getDruidDataSource() { DruidDataSource dds = new DruidDataSource(); dds.setUsername(user); dds.setUrl(jdbcUrl); dds.setPassword(passwd); dds.setDriverClassName(driver); dds.setInitialSize(initialSize); dds.setMaxActive(maxPoolSize); dds.setMaxWait(maxIdleTime); dds.setTestWhileIdle(false); dds.setTestOnReturn(false); dds.setTestOnBorrow(false); return dds; } /** * 獲取Proxool數據源 * @return */ public static ProxoolDataSource getProxoolDataSource() { ProxoolDataSource pds = new ProxoolDataSource(); pds.setAlias("mysql"); pds.setUser(user); pds.setPassword(passwd); pds.setDriverUrl(jdbcUrl); pds.setDriver(driver); pds.setMaximumActiveTime(maxIdleTime); pds.setMaximumConnectionCount(maxPoolSize); pds.setMinimumConnectionCount(initialSize); pds.setPrototypeCount(minPoolSize); pds.setTestBeforeUse(false); pds.setTestAfterUse(false); return pds; } /** * 獲取Apache tomcat jdbc pool數據源 * @return */ public static DataSource getTomcatDataSource() { DataSource ds = new DataSource(); ds.setUrl(jdbcUrl); ds.setUsername(user); ds.setPassword(passwd); ds.setDriverClassName(driver); ds.setInitialSize(initialSize); ds.setMaxIdle(minPoolSize); ds.setMaxActive(maxPoolSize); ds.setTestWhileIdle(false); ds.setTestOnBorrow(false); ds.setTestOnConnect(false); ds.setTestOnReturn(false); return ds; } }

        3.將測試結果粘貼到excel中,生成圖表進行對比,可以很直觀的看出幾種數據源的性能差異,本文底部有此次測試的結果文檔。

        以下就是此次測試結果(本結果只供參考,更具體更准確的測試可以自行進行):

        1.測試次數為10次時:

        平均用時(單位:毫秒):

c3p0 36.29
Proxool 41.46
Druid 32.83
Tomcat Jdbc Pool 32.91

        評論:

        但從時間來看Druid >Tomcat Jdbc Pool >c3p0 >Proxool,在測試的最后Proxool出現了一次異常導致前面較好的波動曲線大幅震盪。 
        只做簡單的10次查詢數據庫時從圖中觀察到穩定性較好的是c3p0 ,他沒有出現較高峰值的情況,雖然平均用時並不是最短的。

        2.測試次數為100次時:


  

        平均用時(單位:毫秒):

c3p0 342.73
Proxool 344.65
Druid 317.15
Tomcat Jdbc Pool 293.23

        評論:

        這里單單從圖表中就會很清晰的發現Tomcat Jdbc Pool的性能穩定且耗時最短。Druid與Proxool依舊出現不穩定的情況。

        3.測試次數為500次時:

        平均用時(單位:毫秒):

c3p0 1420.67
Proxool 1551.69
Druid 1519.61
Tomcat Jdbc Pool 1491.88

        評論:

        此次測試結果比較意外Tomcat Jdbc Pool出現了一次大幅度的波動,Proxool依舊不穩定。在500次查詢過程中c3p0表現出來非常好的穩定性及性能。

        4.測試次數為1000次時:
 

        平均用時(單位:毫秒):

c3p0  3530.26
Proxool  3140.97
Druid  3090.06
Tomcat Jdbc Pool  3164.57


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM