跑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慢,可能跟连接池的存储结构也有一定关系,跟获取连接的时候锁的设计和力度也有关;看源码也是带着一定的目的去看,不然也看不下去,不过也得看看其他连接池的源码,不然也不知道他到底哪个设计使得连接池性能这么好