Druid、C3P0、Tomcat Pool的性能测试与选型

来源:互联网 发布:matlab 生成cell矩阵 编辑:程序博客网 时间:2024/06/08 17:27
  数据库连接池是每个使用数据库项目需要选择的,但是现在有C3P0、Druid、Tomcat Jdbc Pool,三种类型。为了测试一下每种连接池的性能,写了一个小程序,对数据库进行测试。

     C3P0      c3p0-0.9.1.2.jar

     Druid      druid-1.0.11.jar

     Tomcat Jdbc Pool      commons-pool-1.2.jar

     为了保证测试的公正性,配置信息尽量保持一致(个别数据源的个别配置不太一样,就单独设置了一下)。

[java] view plain copy
  1. package test.dbpool.test2;  
  2.   
  3. public class DbConfigParam {  
  4.     // 数据库驱动名称  
  5.     public static String driver = "com.mysql.jdbc.Driver";  
  6.     // 数据库连接地址  
  7.     public static String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=UTF8&connectTimeout=1000&socketTimeout=3000";  
  8.     // 数据库用户名  
  9.     public static String user = "root";  
  10.     // 数据库密码  
  11.     public static String passwd = "";  
  12.     // 连接池初始化大小  
  13.     public static int initialSize = 5;  
  14.     // 连接池最小空闲  
  15.     public static int minPoolSize = 10;  
  16.     // 连接池最大连接数量  
  17.     public static int maxPoolSize = 50;  
  18.     // 最小逐出时间,100秒  
  19.     public static int maxIdleTime = 100000;  
  20.     // 连接失败重试次数  
  21.     public static int retryAttempts = 10;  
  22.     // 当连接池连接耗尽时获取连接数  
  23.     public static int acquireIncrement = 5;  
  24.   
  25.     private DbConfigParam() {  
  26.     }  
  27.   
  28. }  


     因为需要从各个数据源进行测试,所以编写数据源测试接口。

[java] view plain copy
  1. package test.dbpool.test2;  
  2.   
  3. import java.sql.SQLException;  
  4.   
  5. import javax.sql.DataSource;  
  6.   
  7. import test.dbpool.test2.impl.TestDAO;  
  8.   
  9. public interface ITestDataSource {  
  10.     /** 
  11.      * 数据源测试 
  12.      *  
  13.      * @param testDAO 
  14.      * @param ds 
  15.      * @param count 
  16.      * @throws SQLException 
  17.      * @throws InterruptedException 
  18.      */  
  19.     public long queryDs(TestDAO testDAO, DataSource ds, int count) throws SQLException, InterruptedException;  
  20. }  

        编写第一个测试实现
[java] view plain copy
  1. package test.dbpool.test2.impl;  
  2.   
  3. import java.sql.SQLException;  
  4.   
  5. import javax.sql.DataSource;  
  6.   
  7. import test.dbpool.test2.ITestDataSource;  
  8.   
  9. public class TestDataSource implements ITestDataSource {  
  10.     /** 
  11.      * DS测试 
  12.      *  
  13.      * @param testDAO 
  14.      * @param ds 
  15.      * @param count 
  16.      * @throws SQLException 
  17.      */  
  18.     public long queryDs(TestDAO testDAO, DataSource ds, int count) throws SQLException {  
  19.         // [预热数据库连接池] 查询10次以初始化连接池  
  20.         for (int i = 0; i < 10; i++) {  
  21.             testDAO.query(ds.getConnection());  
  22.         }  
  23.         // 开始时间  
  24.         long startMillis = System.currentTimeMillis();  
  25.         // 循环查询  
  26.         for (int i = 0; i < count; i++) {  
  27.             testDAO.query(ds.getConnection());  
  28.         }  
  29.         // 结束时间  
  30.         long endMillis = System.currentTimeMillis();  
  31.         // 输出结束时间  
  32.         long runMillis = endMillis - startMillis;  
  33.         return runMillis;  
  34.     }  
  35. }  

    好了,测试用例编写好了,测试的查询SQL也编写一下,从字面上可以看到每次查询MySQL数据库中的一条记录,遍历一遍然后关闭。

[java] view plain copy
  1. package test.dbpool.test2.impl;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import java.sql.Statement;  
  7.   
  8. public class TestDAO {  
  9.   
  10.     public void query(Connection conn) throws SQLException {  
  11.         if (conn != null) {  
  12.             Statement statement = conn.createStatement();  
  13.             ResultSet rs = statement.executeQuery("select * from user limit 1,5");  
  14.             while (rs.next()) {  
  15.                 String username = rs.getString(2);  
  16.                 //System.out.println(username);  
  17.             }  
  18.             rs.close();  
  19.             statement.close();  
  20.             conn.close();  
  21.         }  
  22.     }  
  23.   
  24. }  

    下面编写数据源获取类
[java] view plain copy
  1. package test.dbpool.test2.impl;  
  2.   
  3. import java.beans.PropertyVetoException;  
  4.   
  5. import org.apache.tomcat.jdbc.pool.DataSource;  
  6. import org.logicalcobwebs.proxool.ProxoolDataSource;  
  7.   
  8. import test.dbpool.test2.DbConfigParam;  
  9.   
  10. import com.alibaba.druid.pool.DruidDataSource;  
  11. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  12.   
  13. public class AllDataSource {  
  14.     /** 
  15.      * 获取c3p0数据源 
  16.      *  
  17.      */  
  18.     public static ComboPooledDataSource getC3p0DataSource() {  
  19.         // 设置参数  
  20.         ComboPooledDataSource cpds = new ComboPooledDataSource();  
  21.         try {  
  22.             cpds.setDriverClass(DbConfigParam.driver);  
  23.         } catch (PropertyVetoException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         cpds.setJdbcUrl(DbConfigParam.jdbcUrl);  
  27.         cpds.setUser(DbConfigParam.user);  
  28.         cpds.setPassword(DbConfigParam.passwd);  
  29.         cpds.setInitialPoolSize(DbConfigParam.initialSize);  
  30.         cpds.setMinPoolSize(DbConfigParam.minPoolSize);  
  31.         cpds.setMaxPoolSize(DbConfigParam.maxPoolSize);  
  32.         cpds.setMaxIdleTime(DbConfigParam.maxIdleTime);  
  33.         cpds.setAcquireRetryAttempts(DbConfigParam.retryAttempts);  
  34.         cpds.setAcquireIncrement(DbConfigParam.acquireIncrement);  
  35.         cpds.setTestConnectionOnCheckin(false);  
  36.         cpds.setTestConnectionOnCheckout(false);  
  37.         return cpds;  
  38.     }  
  39.   
  40.     /** 
  41.      * 获取Druid数据源 
  42.      *  
  43.      */  
  44.     public static DruidDataSource getDruidDataSource() {  
  45.         DruidDataSource dds = new DruidDataSource();  
  46.         dds.setUsername(DbConfigParam.user);  
  47.         dds.setUrl(DbConfigParam.jdbcUrl);  
  48.         dds.setPassword(DbConfigParam.passwd);  
  49.         dds.setDriverClassName(DbConfigParam.driver);  
  50.         dds.setInitialSize(DbConfigParam.initialSize);  
  51.         dds.setMaxActive(DbConfigParam.maxPoolSize);  
  52.         dds.setMaxWait(DbConfigParam.maxIdleTime);  
  53.         dds.setTestWhileIdle(false);  
  54.         dds.setTestOnReturn(false);  
  55.         dds.setTestOnBorrow(false);  
  56.         return dds;  
  57.     }  
  58.   
  59.     /** 
  60.      * 获取Proxool数据源 
  61.      *  
  62.      */  
  63.     public static ProxoolDataSource getProxoolDataSource() {  
  64.         ProxoolDataSource pds = new ProxoolDataSource();  
  65.         pds.setAlias("mysql");  
  66.         pds.setUser(DbConfigParam.user);  
  67.         pds.setPassword(DbConfigParam.passwd);  
  68.         pds.setDriverUrl(DbConfigParam.jdbcUrl);  
  69.         pds.setDriver(DbConfigParam.driver);  
  70.         pds.setMaximumActiveTime(DbConfigParam.maxIdleTime);  
  71.         pds.setMaximumConnectionCount(DbConfigParam.maxPoolSize);  
  72.         pds.setMinimumConnectionCount(DbConfigParam.initialSize);  
  73.         pds.setPrototypeCount(DbConfigParam.minPoolSize);  
  74.         pds.setTestBeforeUse(false);  
  75.         pds.setTestAfterUse(false);  
  76.         return pds;  
  77.     }  
  78.   
  79.     /** 
  80.      * 获取Apache tomcat jdbc pool数据源 
  81.      *  
  82.      */  
  83.     public static DataSource getTomcatDataSource() {  
  84.         DataSource ds = new DataSource();  
  85.         ds.setUrl(DbConfigParam.jdbcUrl);  
  86.         ds.setUsername(DbConfigParam.user);  
  87.         ds.setPassword(DbConfigParam.passwd);  
  88.         ds.setDriverClassName(DbConfigParam.driver);  
  89.         ds.setInitialSize(DbConfigParam.initialSize);  
  90.         ds.setMaxIdle(DbConfigParam.minPoolSize);  
  91.         ds.setMaxActive(DbConfigParam.maxPoolSize);  
  92.         ds.setTestWhileIdle(false);  
  93.         ds.setTestOnBorrow(false);  
  94.         ds.setTestOnConnect(false);  
  95.         ds.setTestOnReturn(false);  
  96.         return ds;  
  97.     }  
  98. }  

     好了,准备工作全部做完了,写一个测试方法的入口吧。
[java] view plain copy
  1. package test.dbpool.test2;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.SQLException;  
  5.   
  6. import javax.sql.DataSource;  
  7.   
  8. import test.dbpool.test2.impl.AllDataSource;  
  9. import test.dbpool.test2.impl.TestDAO;  
  10. import test.dbpool.test2.impl.TestDataSource;  
  11.   
  12. public class TestMain {  
  13.   
  14.     /** 
  15.      * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 
  16.      * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 
  17.      *  
  18.      * @param args 
  19.      * @throws IOException 
  20.      * @throws SQLException 
  21.      * @throws InterruptedException 
  22.      */  
  23.     public static void main(String[] args) throws IOException, SQLException, InterruptedException {  
  24.         // 准备数据源  
  25.         TestDAO testDAO = new TestDAO();  
  26.         ITestDataSource testDataSource = null;  
  27.         {  
  28.             System.out.println("===========单线程执行===============");  
  29.             testDataSource = new TestDataSource();  
  30.             batchTestRunMillis(testDAO, testDataSource);  
  31.         }  
  32.     }  
  33.   
  34.     /** 
  35.      * @param testDAO 
  36.      * @param testDataSource 
  37.      * @throws SQLException 
  38.      * @throws InterruptedException 
  39.      */  
  40.     private static void batchTestRunMillis(TestDAO testDAO, ITestDataSource testDataSource) throws SQLException,  
  41.             InterruptedException {  
  42.         // testDataSource = new TestDataSourceByThread();  
  43.         // 查询次数  
  44.         int count = 5000;  
  45.         long c3p0Millis = 0l, druidMillis = 0l, proxoolMillis = 0l, tomcatMillis = 0l;  
  46.         {// Proxool数据源  
  47.             DataSource dataSource = AllDataSource.getProxoolDataSource();  
  48.             proxoolMillis = testDataSource(testDataSource, "Proxool", dataSource, testDAO, count);  
  49.             dataSource = null;  
  50.         }  
  51.         {  
  52.             // c3p0数据源  
  53.             DataSource dataSource = AllDataSource.getC3p0DataSource();  
  54.             c3p0Millis = testDataSource(testDataSource, "C3P0", dataSource, testDAO, count);  
  55.             dataSource = null;  
  56.         }  
  57.         {// Druid数据源  
  58.             DataSource dataSource = AllDataSource.getDruidDataSource();  
  59.             druidMillis = testDataSource(testDataSource, "Druid", dataSource, testDAO, count);  
  60.             dataSource = null;  
  61.         }  
  62.         {// Tomcat Jdbc Pool数据源  
  63.             DataSource dataSource = AllDataSource.getTomcatDataSource();  
  64.             tomcatMillis = testDataSource(testDataSource, "Tomcat Jdbc Pool", dataSource, testDAO, count);  
  65.             dataSource = null;  
  66.         }  
  67.   
  68.         System.out.println("统计结果:[C3P0]平均耗时" + c3p0Millis + "ms");  
  69.         System.out.println("统计结果:[Druid]平均耗时" + druidMillis + "ms");  
  70.         System.out.println("统计结果:[Proxool]平均耗时" + proxoolMillis + "ms");  
  71.         System.out.println("统计结果:[Tomcat]平均耗时" + tomcatMillis + "ms");  
  72.     }  
  73.   
  74.     /** 
  75.      * @param c3p0DataSource 
  76.      * @param testDAO 
  77.      * @param count 
  78.      * @throws SQLException 
  79.      * @throws InterruptedException 
  80.      */  
  81.     private static long testDataSource(ITestDataSource testDataSource, String dataSourceName,  
  82.             DataSource c3p0DataSource, TestDAO testDAO, int count) throws SQLException, InterruptedException {  
  83.         System.out.println();  
  84.         System.out.println("查询次数为:" + count);  
  85.         System.out.println("==========================" + dataSourceName + " 测试开始==========================");  
  86.         // 测试c3p0  
  87.         long[] runMillis = new long[100];  
  88.         for (int i = runMillis.length - 1; i >= 0; i--) {  
  89.             runMillis[i] = testDataSource.queryDs(testDAO, c3p0DataSource, count);  
  90.             System.out.print("|" + i + "=" + runMillis[i] + "ms");  
  91.             if (i % 10 == 0) {  
  92.                 System.out.println();  
  93.             }  
  94.         }  
  95.         // 开始统计平均值  
  96.         long avgMillis = 0l;  
  97.         for (int i = runMillis.length - 1; i >= 0; i--) {  
  98.             avgMillis += runMillis[i];  
  99.         }  
  100.         avgMillis = avgMillis / runMillis.length;  
  101.         System.out.println();  
  102.         System.out.println("==========================" + dataSourceName + " 测试结束==========================");  
  103.         System.out.println("平均耗时:" + avgMillis + "ms");  
  104.         return avgMillis;  
  105.     }  
  106.   
  107. }  


至此,测试用例全部编写完了,已经实现对多个数据源连接池进行串行测试,并对测试结果进行汇总。


[plain] view plain copy
  1. ===========单线程执行===============  
  2. log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).  
  3. log4j:WARN Please initialize the log4j system properly.  
  4. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.  
  5. 查询次数为:1000  
  6.   
  7. ==========================C3P0 测试开始==========================  
  8. |99=1085ms|98=972ms|97=966ms|96=977ms|95=960ms|94=911ms|93=929ms|92=959ms|91=982ms|90=950ms  
  9. |89=933ms|88=915ms|87=913ms|86=944ms|85=929ms|84=925ms|83=955ms|82=981ms|81=990ms|80=929ms  
  10. |79=905ms|78=909ms|77=931ms|76=922ms|75=936ms|74=952ms|73=914ms|72=961ms|71=921ms|70=965ms  
  11. |69=918ms|68=906ms|67=937ms|66=1053ms|65=933ms|64=970ms|63=948ms|62=932ms|61=937ms|60=929ms  
  12. |59=929ms|58=938ms|57=887ms|56=943ms|55=1000ms|54=920ms|53=955ms|52=934ms|51=925ms|50=939ms  
  13. |49=922ms|48=906ms|47=941ms|46=931ms|45=918ms|44=950ms|43=930ms|42=917ms|41=946ms|40=920ms  
  14. |39=941ms|38=930ms|37=913ms|36=904ms|35=931ms|34=938ms|33=936ms|32=903ms|31=898ms|30=982ms  
  15. |29=919ms|28=938ms|27=933ms|26=880ms|25=924ms|24=934ms|23=915ms|22=937ms|21=945ms|20=975ms  
  16. |19=994ms|18=1010ms|17=1031ms|16=935ms|15=899ms|14=931ms|13=943ms|12=930ms|11=921ms|10=928ms  
  17. |9=909ms|8=939ms|7=951ms|6=904ms|5=910ms|4=890ms|3=932ms|2=959ms|1=909ms|0=939ms  
  18.   
  19. ==========================C3P0 测试结束==========================  
  20. 平均耗时:938ms  
  21. 查询次数为:1000  
  22.   
  23. ==========================Druid 测试开始==========================  
  24. |99=956ms|98=897ms|97=897ms|96=901ms|95=869ms|94=874ms|93=860ms|92=889ms|91=914ms|90=869ms  
  25. |89=900ms|88=871ms|87=871ms|86=871ms|85=876ms|84=901ms|83=983ms|82=877ms|81=911ms|80=888ms  
  26. |79=890ms|78=905ms|77=928ms|76=932ms|75=921ms|74=920ms|73=893ms|72=881ms|71=879ms|70=905ms  
  27. |69=872ms|68=875ms|67=894ms|66=868ms|65=901ms|64=874ms|63=892ms|62=896ms|61=881ms|60=901ms  
  28. |59=871ms|58=903ms|57=884ms|56=888ms|55=899ms|54=933ms|53=939ms|52=966ms|51=866ms|50=887ms  
  29. |49=854ms|48=902ms|47=909ms|46=895ms|45=910ms|44=899ms|43=890ms|42=891ms|41=899ms|40=874ms  
  30. |39=890ms|38=856ms|37=885ms|36=908ms|35=889ms|34=893ms|33=893ms|32=865ms|31=898ms|30=889ms  
  31. |29=898ms|28=899ms|27=864ms|26=905ms|25=887ms|24=905ms|23=910ms|22=882ms|21=898ms|20=899ms  
  32. |19=880ms|18=895ms|17=896ms|16=883ms|15=906ms|14=893ms|13=938ms|12=898ms|11=876ms|10=873ms  
  33. |9=892ms|8=864ms|7=886ms|6=880ms|5=889ms|4=866ms|3=876ms|2=885ms|1=874ms|0=872ms  
  34.   
  35. ==========================Druid 测试结束==========================  
  36. 平均耗时:892ms  
  37. 查询次数为:1000  
  38.   
  39. ==========================Proxool 测试开始==========================  
  40. |99=1070ms|98=1083ms|97=986ms|96=972ms|95=980ms|94=1004ms|93=992ms|92=1026ms|91=1012ms|90=978ms  
  41. |89=1050ms|88=1133ms|87=1148ms|86=1012ms|85=981ms|84=973ms|83=1021ms|82=1054ms|81=1024ms|80=1005ms  
  42. |79=1001ms|78=979ms|77=992ms|76=997ms|75=975ms|74=992ms|73=1052ms|72=1039ms|71=988ms|70=1007ms  
  43. |69=994ms|68=1005ms|67=1021ms|66=990ms|65=973ms|64=1000ms|63=1014ms|62=968ms|61=998ms|60=1012ms  
  44. |59=1004ms|58=1130ms|57=1033ms|56=960ms|55=989ms|54=1001ms|53=969ms|52=997ms|51=979ms|50=1020ms  
  45. |49=982ms|48=1010ms|47=979ms|46=989ms|45=995ms|44=1013ms|43=997ms|42=1007ms|41=1008ms|40=965ms  
  46. |39=993ms|38=1003ms|37=981ms|36=1051ms|35=1097ms|34=1071ms|33=1035ms|32=1004ms|31=974ms|30=1096ms  
  47. |29=1136ms|28=1062ms|27=1099ms|26=1150ms|25=1128ms|24=1129ms|23=1123ms|22=1094ms|21=1112ms|20=1158ms  
  48. |19=1232ms|18=1139ms|17=1098ms|16=1149ms|15=1125ms|14=1110ms|13=1016ms|12=977ms|11=1010ms|10=960ms  
  49. |9=1001ms|8=1049ms|7=1026ms|6=1042ms|5=1046ms|4=970ms|3=1002ms|2=1069ms|1=1122ms|0=991ms  
  50.   
  51. ==========================Proxool 测试结束==========================  
  52. 平均耗时:1031ms  
  53. 查询次数为:1000  
  54.   
  55. ==========================Tomcat Jdbc Pool 测试开始==========================  
  56. |99=929ms|98=1035ms|97=1007ms|96=939ms|95=903ms|94=880ms|93=899ms|92=910ms|91=906ms|90=880ms  
  57. |89=924ms|88=892ms|87=926ms|86=923ms|85=910ms|84=907ms|83=876ms|82=906ms|81=893ms|80=886ms  
  58. |79=918ms|78=894ms|77=960ms|76=873ms|75=969ms|74=913ms|73=882ms|72=1003ms|71=927ms|70=946ms  
  59. |69=907ms|68=867ms|67=944ms|66=944ms|65=997ms|64=917ms|63=892ms|62=900ms|61=872ms|60=897ms  
  60. |59=903ms|58=878ms|57=910ms|56=892ms|55=916ms|54=899ms|53=903ms|52=881ms|51=897ms|50=896ms  
  61. |49=901ms|48=901ms|47=950ms|46=964ms|45=920ms|44=901ms|43=925ms|42=899ms|41=907ms|40=888ms  
  62. |39=899ms|38=903ms|37=877ms|36=895ms|35=901ms|34=878ms|33=890ms|32=892ms|31=911ms|30=931ms  
  63. |29=885ms|28=890ms|27=900ms|26=911ms|25=989ms|24=903ms|23=905ms|22=952ms|21=938ms|20=977ms  
  64. |19=906ms|18=895ms|17=910ms|16=885ms|15=904ms|14=903ms|13=908ms|12=987ms|11=897ms|10=928ms  
  65. |9=981ms|8=969ms|7=908ms|6=955ms|5=900ms|4=905ms|3=936ms|2=942ms|1=958ms|0=964ms  
  66.   
  67. ==========================Tomcat Jdbc Pool 测试结束==========================  
  68. 平均耗时:916ms  
  69. 统计结果:[C3P0]平均耗时938ms  
  70. 统计结果:[Druid]平均耗时892ms  
  71. 统计结果:[Proxool]平均耗时1031ms  
  72. 统计结果:[Tomcat]平均耗时916ms  


这个测试真的十分痛苦,需要等好久好久,而且我们实际使用过程中,数据库连接池是串行运行的,所以还是写一个并发执行的数据源测试用例比较靠谱。这里扩展一个并发测试的测试用例

[java] view plain copy
  1. TestDataSourceByThread.java  
[这个卖一个关子,需要的到文章最下面的连接路径下载吧。解压缩密码也有呀,O(∩_∩)O]

重新编写一下测试入口


[java] view plain copy
  1. package test.dbpool.test2;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.SQLException;  
  5.   
  6. import javax.sql.DataSource;  
  7.   
  8. import test.dbpool.test2.impl.AllDataSource;  
  9. import test.dbpool.test2.impl.TestDAO;  
  10. import test.dbpool.test2.impl.TestDataSource;  
  11. import test.dbpool.test2.impl.TestDataSourceByThread;  
  12.   
  13. public class TestMain {  
  14.   
  15.     /** 
  16.      * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 
  17.      * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 
  18.      *  
  19.      * @param args 
  20.      * @throws IOException 
  21.      * @throws SQLException 
  22.      * @throws InterruptedException 
  23.      */  
  24.     public static void main(String[] args) throws IOException, SQLException, InterruptedException {  
  25.         // 准备数据源  
  26.         TestDAO testDAO = new TestDAO();  
  27.         ITestDataSource testDataSource = null;  
  28.         {  
  29.             System.out.println("===========单线程执行===============");  
  30.             testDataSource = new TestDataSource();  
  31.             batchTestRunMillis(testDAO, testDataSource);  
  32.         }  
  33.         {  
  34.             System.out.println("===========多线程执行===============");  
  35.             testDataSource = new TestDataSourceByThread();  
  36.             batchTestRunMillis(testDAO, testDataSource);  
  37.         }  
  38.     }  
  39.   
  40.     /** 
  41.      * @param testDAO 
  42.      * @param testDataSource 
  43.      * @throws SQLException 
  44.      * @throws InterruptedException 
  45.      */  
  46.     private static void batchTestRunMillis(TestDAO testDAO, ITestDataSource testDataSource) throws SQLException,  
  47.             InterruptedException {  
  48.         // testDataSource = new TestDataSourceByThread();  
  49.         // 查询次数  
  50.         int count = 5000;  
  51.         long c3p0Millis = 0l, druidMillis = 0l, proxoolMillis = 0l, tomcatMillis = 0l;  
  52.         // {// Proxool数据源  
  53.         // DataSource dataSource = AllDataSource.getProxoolDataSource();  
  54.         // proxoolMillis = testDataSource(testDataSource, "Proxool", dataSource,  
  55.         // testDAO, count);  
  56.         // dataSource = null;  
  57.         // }  
  58.         {  
  59.             // c3p0数据源  
  60.             DataSource dataSource = AllDataSource.getC3p0DataSource();  
  61.             c3p0Millis = testDataSource(testDataSource, "C3P0", dataSource, testDAO, count);  
  62.             dataSource = null;  
  63.         }  
  64.         {// Druid数据源  
  65.             DataSource dataSource = AllDataSource.getDruidDataSource();  
  66.             druidMillis = testDataSource(testDataSource, "Druid", dataSource, testDAO, count);  
  67.             dataSource = null;  
  68.         }  
  69.         {// Tomcat Jdbc Pool数据源  
  70.             DataSource dataSource = AllDataSource.getTomcatDataSource();  
  71.             tomcatMillis = testDataSource(testDataSource, "Tomcat Jdbc Pool", dataSource, testDAO, count);  
  72.             dataSource = null;  
  73.         }  
  74.   
  75.         System.out.println("统计结果:[C3P0]平均耗时" + c3p0Millis + "ms");  
  76.         System.out.println("统计结果:[Druid]平均耗时" + druidMillis + "ms");  
  77.         System.out.println("统计结果:[Proxool]平均耗时" + proxoolMillis + "ms");  
  78.         System.out.println("统计结果:[Tomcat]平均耗时" + tomcatMillis + "ms");  
  79.     }  
  80.   
  81.     /** 
  82.      * @param c3p0DataSource 
  83.      * @param testDAO 
  84.      * @param count 
  85.      * @throws SQLException 
  86.      * @throws InterruptedException 
  87.      */  
  88.     private static long testDataSource(ITestDataSource testDataSource, String dataSourceName,  
  89.             DataSource c3p0DataSource, TestDAO testDAO, int count) throws SQLException, InterruptedException {  
  90.         System.out.println();  
  91.         System.out.println("查询次数为:" + count);  
  92.         System.out.println("==========================" + dataSourceName + " 测试开始==========================");  
  93.         // 测试c3p0  
  94.         long[] runMillis = new long[100];  
  95.         for (int i = runMillis.length - 1; i >= 0; i--) {  
  96.             runMillis[i] = testDataSource.queryDs(testDAO, c3p0DataSource, count);  
  97.             System.out.print("|" + i + "=" + runMillis[i] + "ms");  
  98.             if (i % 10 == 0) {  
  99.                 System.out.println();  
  100.             }  
  101.         }  
  102.         // 开始统计平均值  
  103.         long avgMillis = 0l;  
  104.         for (int i = runMillis.length - 1; i >= 0; i--) {  
  105.             avgMillis += runMillis[i];  
  106.         }  
  107.         avgMillis = avgMillis / runMillis.length;  
  108.         System.out.println();  
  109.         System.out.println("==========================" + dataSourceName + " 测试结束==========================");  
  110.         System.out.println("平均耗时:" + avgMillis + "ms");  
  111.         return avgMillis;  
  112.     }  
  113.   
  114. }  

运行结果如下,你想自己测试的话,自己去跑。
[plain] view plain copy
  1. ===========单线程执行===============  
  2. log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).  
  3. log4j:WARN Please initialize the log4j system properly.  
  4. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.  
  5. 查询次数为:1000  
  6.   
  7. ==========================C3P0 测试开始==========================  
  8. |99=1085ms|98=972ms|97=966ms|96=977ms|95=960ms|94=911ms|93=929ms|92=959ms|91=982ms|90=950ms  
  9. |89=933ms|88=915ms|87=913ms|86=944ms|85=929ms|84=925ms|83=955ms|82=981ms|81=990ms|80=929ms  
  10. |79=905ms|78=909ms|77=931ms|76=922ms|75=936ms|74=952ms|73=914ms|72=961ms|71=921ms|70=965ms  
  11. |69=918ms|68=906ms|67=937ms|66=1053ms|65=933ms|64=970ms|63=948ms|62=932ms|61=937ms|60=929ms  
  12. |59=929ms|58=938ms|57=887ms|56=943ms|55=1000ms|54=920ms|53=955ms|52=934ms|51=925ms|50=939ms  
  13. |49=922ms|48=906ms|47=941ms|46=931ms|45=918ms|44=950ms|43=930ms|42=917ms|41=946ms|40=920ms  
  14. |39=941ms|38=930ms|37=913ms|36=904ms|35=931ms|34=938ms|33=936ms|32=903ms|31=898ms|30=982ms  
  15. |29=919ms|28=938ms|27=933ms|26=880ms|25=924ms|24=934ms|23=915ms|22=937ms|21=945ms|20=975ms  
  16. |19=994ms|18=1010ms|17=1031ms|16=935ms|15=899ms|14=931ms|13=943ms|12=930ms|11=921ms|10=928ms  
  17. |9=909ms|8=939ms|7=951ms|6=904ms|5=910ms|4=890ms|3=932ms|2=959ms|1=909ms|0=939ms  
  18.   
  19. ==========================C3P0 测试结束==========================  
  20. 平均耗时:938ms  
  21. 查询次数为:1000  
  22.   
  23. ==========================Druid 测试开始==========================  
  24. |99=956ms|98=897ms|97=897ms|96=901ms|95=869ms|94=874ms|93=860ms|92=889ms|91=914ms|90=869ms  
  25. |89=900ms|88=871ms|87=871ms|86=871ms|85=876ms|84=901ms|83=983ms|82=877ms|81=911ms|80=888ms  
  26. |79=890ms|78=905ms|77=928ms|76=932ms|75=921ms|74=920ms|73=893ms|72=881ms|71=879ms|70=905ms  
  27. |69=872ms|68=875ms|67=894ms|66=868ms|65=901ms|64=874ms|63=892ms|62=896ms|61=881ms|60=901ms  
  28. |59=871ms|58=903ms|57=884ms|56=888ms|55=899ms|54=933ms|53=939ms|52=966ms|51=866ms|50=887ms  
  29. |49=854ms|48=902ms|47=909ms|46=895ms|45=910ms|44=899ms|43=890ms|42=891ms|41=899ms|40=874ms  
  30. |39=890ms|38=856ms|37=885ms|36=908ms|35=889ms|34=893ms|33=893ms|32=865ms|31=898ms|30=889ms  
  31. |29=898ms|28=899ms|27=864ms|26=905ms|25=887ms|24=905ms|23=910ms|22=882ms|21=898ms|20=899ms  
  32. |19=880ms|18=895ms|17=896ms|16=883ms|15=906ms|14=893ms|13=938ms|12=898ms|11=876ms|10=873ms  
  33. |9=892ms|8=864ms|7=886ms|6=880ms|5=889ms|4=866ms|3=876ms|2=885ms|1=874ms|0=872ms  
  34.   
  35. ==========================Druid 测试结束==========================  
  36. 平均耗时:892ms  
  37. 查询次数为:1000  
  38.   
  39. ==========================Proxool 测试开始==========================  
  40. |99=1070ms|98=1083ms|97=986ms|96=972ms|95=980ms|94=1004ms|93=992ms|92=1026ms|91=1012ms|90=978ms  
  41. |89=1050ms|88=1133ms|87=1148ms|86=1012ms|85=981ms|84=973ms|83=1021ms|82=1054ms|81=1024ms|80=1005ms  
  42. |79=1001ms|78=979ms|77=992ms|76=997ms|75=975ms|74=992ms|73=1052ms|72=1039ms|71=988ms|70=1007ms  
  43. |69=994ms|68=1005ms|67=1021ms|66=990ms|65=973ms|64=1000ms|63=1014ms|62=968ms|61=998ms|60=1012ms  
  44. |59=1004ms|58=1130ms|57=1033ms|56=960ms|55=989ms|54=1001ms|53=969ms|52=997ms|51=979ms|50=1020ms  
  45. |49=982ms|48=1010ms|47=979ms|46=989ms|45=995ms|44=1013ms|43=997ms|42=1007ms|41=1008ms|40=965ms  
  46. |39=993ms|38=1003ms|37=981ms|36=1051ms|35=1097ms|34=1071ms|33=1035ms|32=1004ms|31=974ms|30=1096ms  
  47. |29=1136ms|28=1062ms|27=1099ms|26=1150ms|25=1128ms|24=1129ms|23=1123ms|22=1094ms|21=1112ms|20=1158ms  
  48. |19=1232ms|18=1139ms|17=1098ms|16=1149ms|15=1125ms|14=1110ms|13=1016ms|12=977ms|11=1010ms|10=960ms  
  49. |9=1001ms|8=1049ms|7=1026ms|6=1042ms|5=1046ms|4=970ms|3=1002ms|2=1069ms|1=1122ms|0=991ms  
  50.   
  51. ==========================Proxool 测试结束==========================  
  52. 平均耗时:1031ms  
  53. 查询次数为:1000  
  54.   
  55. ==========================Tomcat Jdbc Pool 测试开始==========================  
  56. |99=929ms|98=1035ms|97=1007ms|96=939ms|95=903ms|94=880ms|93=899ms|92=910ms|91=906ms|90=880ms  
  57. |89=924ms|88=892ms|87=926ms|86=923ms|85=910ms|84=907ms|83=876ms|82=906ms|81=893ms|80=886ms  
  58. |79=918ms|78=894ms|77=960ms|76=873ms|75=969ms|74=913ms|73=882ms|72=1003ms|71=927ms|70=946ms  
  59. |69=907ms|68=867ms|67=944ms|66=944ms|65=997ms|64=917ms|63=892ms|62=900ms|61=872ms|60=897ms  
  60. |59=903ms|58=878ms|57=910ms|56=892ms|55=916ms|54=899ms|53=903ms|52=881ms|51=897ms|50=896ms  
  61. |49=901ms|48=901ms|47=950ms|46=964ms|45=920ms|44=901ms|43=925ms|42=899ms|41=907ms|40=888ms  
  62. |39=899ms|38=903ms|37=877ms|36=895ms|35=901ms|34=878ms|33=890ms|32=892ms|31=911ms|30=931ms  
  63. |29=885ms|28=890ms|27=900ms|26=911ms|25=989ms|24=903ms|23=905ms|22=952ms|21=938ms|20=977ms  
  64. |19=906ms|18=895ms|17=910ms|16=885ms|15=904ms|14=903ms|13=908ms|12=987ms|11=897ms|10=928ms  
  65. |9=981ms|8=969ms|7=908ms|6=955ms|5=900ms|4=905ms|3=936ms|2=942ms|1=958ms|0=964ms  
  66.   
  67. ==========================Tomcat Jdbc Pool 测试结束==========================  
  68. 平均耗时:916ms  
  69. 统计结果:[C3P0]平均耗时938ms  
  70. 统计结果:[Druid]平均耗时892ms  
  71. 统计结果:[Proxool]平均耗时1031ms  
  72. 统计结果:[Tomcat]平均耗时916ms  
  73. ===========多线程执行===============  
  74. 查询次数为:1000  
  75.   
  76. ==========================C3P0 测试开始==========================  
  77. |99=286ms|98=457ms|97=282ms|96=290ms|95=276ms|94=292ms|93=279ms|92=277ms|91=293ms|90=279ms  
  78. |89=282ms|88=277ms|87=276ms|86=277ms|85=277ms|84=287ms|83=286ms|82=278ms|81=281ms|80=276ms  
  79. |79=277ms|78=274ms|77=271ms|76=274ms|75=278ms|74=278ms|73=276ms|72=279ms|71=274ms|70=273ms  
  80. |69=280ms|68=277ms|67=278ms|66=271ms|65=282ms|64=275ms|63=281ms|62=274ms|61=274ms|60=282ms  
  81. |59=278ms|58=280ms|57=277ms|56=275ms|55=283ms|54=276ms|53=287ms|52=276ms|51=291ms|50=285ms  
  82. |49=282ms|48=294ms|47=290ms|46=285ms|45=277ms|44=272ms|43=274ms|42=275ms|41=280ms|40=280ms  
  83. |39=289ms|38=278ms|37=275ms|36=277ms|35=271ms|34=274ms|33=271ms|32=279ms|31=288ms|30=274ms  
  84. |29=282ms|28=281ms|27=274ms|26=278ms|25=278ms|24=277ms|23=272ms|22=271ms|21=272ms|20=275ms  
  85. |19=276ms|18=276ms|17=276ms|16=272ms|15=276ms|14=272ms|13=273ms|12=278ms|11=280ms|10=276ms  
  86. |9=274ms|8=285ms|7=283ms|6=279ms|5=272ms|4=276ms|3=276ms|2=274ms|1=272ms|0=272ms  
  87.   
  88. ==========================C3P0 测试结束==========================  
  89. 平均耗时:280ms  
  90. 查询次数为:1000  
  91.   
  92. ==========================Druid 测试开始==========================  
  93. |99=269ms|98=271ms|97=268ms|96=268ms|95=271ms|94=276ms|93=272ms|92=271ms|91=267ms|90=271ms  
  94. |89=270ms|88=274ms|87=270ms|86=271ms|85=272ms|84=270ms|83=268ms|82=268ms|81=269ms|80=275ms  
  95. |79=273ms|78=271ms|77=273ms|76=306ms|75=289ms|74=269ms|73=270ms|72=270ms|71=270ms|70=270ms  
  96. |69=269ms|68=273ms|67=291ms|66=271ms|65=270ms|64=277ms|63=274ms|62=296ms|61=353ms|60=284ms  
  97. |59=284ms|58=274ms|57=274ms|56=269ms|55=271ms|54=268ms|53=268ms|52=274ms|51=273ms|50=272ms  
  98. |49=279ms|48=273ms|47=271ms|46=268ms|45=269ms|44=271ms|43=270ms|42=272ms|41=273ms|40=270ms  
  99. |39=272ms|38=268ms|37=270ms|36=275ms|35=269ms|34=287ms|33=308ms|32=313ms|31=317ms|30=274ms  
  100. |29=272ms|28=270ms|27=271ms|26=270ms|25=271ms|24=276ms|23=276ms|22=269ms|21=270ms|20=270ms  
  101. |19=271ms|18=271ms|17=272ms|16=271ms|15=271ms|14=269ms|13=271ms|12=269ms|11=270ms|10=270ms  
  102. |9=272ms|8=277ms|7=270ms|6=274ms|5=268ms|4=271ms|3=271ms|2=271ms|1=270ms|0=270ms  
  103.   
  104. ==========================Druid 测试结束==========================  
  105. 平均耗时:274ms  
  106. 查询次数为:1000  
  107.   
  108. ==========================Proxool 测试开始==========================  
  109. |99=289ms|98=280ms|97=278ms|96=276ms|95=278ms|94=284ms|93=282ms|92=287ms|91=279ms|90=279ms  
  110. |89=283ms|88=292ms|87=283ms|86=282ms|85=296ms|84=285ms|83=280ms|82=279ms|81=282ms|80=283ms  
  111. |79=290ms|78=281ms|77=281ms|76=280ms|75=283ms|74=279ms|73=285ms|72=467ms|71=281ms|70=278ms  
  112. |69=282ms|68=285ms|67=274ms|66=279ms|65=282ms|64=279ms|63=273ms|62=278ms|61=282ms|60=275ms  
  113. |59=286ms|58=280ms|57=280ms|56=285ms|55=288ms|54=284ms|53=278ms|52=281ms|51=289ms|50=279ms  
  114. |49=282ms|48=288ms|47=282ms|46=278ms|45=276ms|44=282ms|43=275ms|42=279ms|41=275ms|40=308ms  
  115. |39=292ms|38=303ms|37=286ms|36=278ms|35=279ms|34=281ms|33=274ms|32=274ms|31=281ms|30=280ms  
  116. |29=283ms|28=275ms|27=278ms|26=273ms|25=278ms|24=279ms|23=286ms|22=285ms|21=284ms|20=282ms  
  117. |19=281ms|18=279ms|17=282ms|16=281ms|15=274ms|14=276ms|13=278ms|12=279ms|11=277ms|10=279ms  
  118. |9=286ms|8=280ms|7=288ms|6=318ms|5=334ms|4=318ms|3=285ms|2=283ms|1=279ms|0=286ms  
  119.   
  120. ==========================Proxool 测试结束==========================  
  121. 平均耗时:284ms  
  122. 查询次数为:1000  
  123.   
  124. ==========================Tomcat Jdbc Pool 测试开始==========================  
  125. |99=277ms|98=274ms|97=277ms|96=274ms|95=287ms|94=1198ms|93=272ms|92=270ms|91=272ms|90=278ms  
  126. |89=278ms|88=298ms|87=282ms|86=293ms|85=273ms|84=271ms|83=273ms|82=276ms|81=366ms|80=306ms  
  127. |79=272ms|78=271ms|77=356ms|76=305ms|75=284ms|74=275ms|73=270ms|72=267ms|71=271ms|70=271ms  
  128. |69=276ms|68=273ms|67=274ms|66=271ms|65=269ms|64=271ms|63=271ms|62=270ms|61=328ms|60=355ms  
  129. |59=273ms|58=269ms|57=281ms|56=278ms|55=273ms|54=269ms|53=272ms|52=270ms|51=271ms|50=272ms  
  130. |49=271ms|48=272ms|47=269ms|46=272ms|45=272ms|44=269ms|43=270ms|42=271ms|41=275ms|40=272ms  
  131. |39=278ms|38=272ms|37=271ms|36=273ms|35=272ms|34=272ms|33=272ms|32=275ms|31=269ms|30=268ms  
  132. |29=271ms|28=270ms|27=269ms|26=274ms|25=269ms|24=272ms|23=270ms|22=271ms|21=273ms|20=273ms  
  133. |19=273ms|18=272ms|17=270ms|16=270ms|15=269ms|14=269ms|13=273ms|12=272ms|11=274ms|10=272ms  
  134. |9=273ms|8=268ms|7=268ms|6=269ms|5=271ms|4=277ms|3=272ms|2=273ms|1=268ms|0=269ms  
  135.   
  136. ==========================Tomcat Jdbc Pool 测试结束==========================  
  137. 平均耗时:285ms  
  138. 统计结果:[C3P0]平均耗时280ms  
  139. 统计结果:[Druid]平均耗时274ms  
  140. 统计结果:[Proxool]平均耗时284ms  
  141. 统计结果:[Tomcat]平均耗时285ms  

      总结:多次测试后发现Druid的性能优于C3P0,但是如果数据库是本地数据库127.0.0.1的时候,不知道为什么tomcat的连接池性能最好(没时间研究,谁知道告诉我也行,估计tomcat对这个做了什么优化?)。

    写了真多,写个评语吧:推荐项目使用Druid连接池,实在不行,你用Tomcat连接池也可以,如果你们的项目真的很老,那就用C3P0算了。

 


写了这么多,你还是那么懒,算了,好人做到底:http://download.csdn.net/detail/xzknet/9181089

下载下去,直接可用。哦,对了解压缩密码:test-dbpool

呵呵。
阅读全文
0 0
原创粉丝点击