跑Druid的单元测试

1.连接池参数

    private int      initialSize                = 50;
    private int      minIdle                    = 3;
    private int      maxIdle                    = 8;
    private int      maxActive                  = 50;
    private String   validationQuery            = "SELECT 1";
    private boolean  testOnBorrow               = false;

    private long     minEvictableIdleTimeMillis = 2000;
    public final int LOOP_COUNT                 = 5;
    public final int COUNT                      = 1000 * 1000 * 1;

测试连接代码

private void p0(DataSource dataSource, String name) throws SQLException {
        long startMillis = System.currentTimeMillis();
        long startYGC = TestUtil.getYoungGC();
        long startFullGC = TestUtil.getFullGC();

        for (int i = 0; i < COUNT; ++i) {
            Connection conn = dataSource.getConnection();
            Statement stmt = conn.createStatement();
//            ResultSet rs = stmt.executeQuery("SELECT 1");
//            rs.close();
//            stmt.close();
            conn.close();
        }
        long millis = System.currentTimeMillis() - startMillis;
        long ygc = TestUtil.getYoungGC() - startYGC;
        long fullGC = TestUtil.getFullGC() - startFullGC;

        System.out.println(name + " millis : " + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC "
                           + fullGC);
    }

 

2.连接池对比

druid使用数组存储连接

druid millis : 5,882, YGC 11 FGC 0
druid millis : 839, YGC 2 FGC 0
druid millis : 911, YGC 2 FGC 0
druid millis : 760, YGC 1 FGC 0
druid millis : 740, YGC 2 FGC 0

注释掉初始化连接代码的代码,为了验证initialSize这个参数到底有什么作用,这个参数设置并没有提高性能,目前猜测createAndStartCreatorThread这个线程创建连接的时候出现异常情况或者这个线程创建失败了,导致后面获取连接不可用

else if (!asyncInit) {
                // init connections
                while (poolingCount < initialSize) {
                    try {
                        PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
                        DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
                        connections[poolingCount++] = holder;
                    } catch (SQLException ex) {
                        LOG.error("init datasource error, url: " + this.getUrl(), ex);
                        if (initExceptionThrow) {
                            connectError = ex;
                            break;
                        } else {
                            Thread.sleep(3000);
                        }
                    }
                }

                if (poolingCount > 0) {
                    poolingPeak = poolingCount;
                    poolingPeakTime = System.currentTimeMillis();
                }
            }

 

dbcp使用链表存储连接

dbcp millis : 2,381, YGC 10 FGC 0
dbcp millis : 1,302, YGC 3 FGC 0
dbcp millis : 1,131, YGC 3 FGC 0
dbcp millis : 1,122, YGC 3 FGC 0
dbcp millis : 1,079, YGC 3 FGC 0

c3p0

c3p0 millis : 7,269, YGC 14 FGC 0
c3p0 millis : 5,645, YGC 14 FGC 0
c3p0 millis : 5,514, YGC 24 FGC 0
c3p0 millis : 5,732, YGC 22 FGC 0
c3p0 millis : 5,532, YGC 25 FGC 0

BoneCPDataSource和
org.apache.tomcat.jdbc.pool.DataSource慢的离谱j,不知道单元测试有什么配置未配置导致的

boneCP millis : 517,570, YGC 1184 FGC 4

通过几个线程池的对比,druid确实性能比较好,druid在第一次获取连接会比较慢,慢在初始化连接池操作,后面直接从连接池取连接会很快,其他连接池也有相同的设计,目前还没发现为什么比druid慢,可能跟连接池的存储结构也有一定关系,跟获取连接的时候锁的设计和力度也有关;看源码也是带着一定的目的去看,不然也看不下去,不过也得看看其他连接池的源码,不然也不知道他到底哪个设计使得连接池性能这么好

posted on 2022-05-15 23:48  柳无情  阅读(133)  评论(0编辑  收藏  举报