前面已经做了c3p0的性能测试,我们这次来测试一下Druid,看看Druid的性能是否与官方说的那样优秀。
1.改造代码:
/**
* Druid实现
*/
public void getUsrInfoWithDruid(DruidDataSource dds,Integer usrId) {
String sql="SELECT * FROM USER u WHERE u.USR_ID=" + usrId;
try {
// 通过属性文件设置Druid参数
conn=dds.getConnection();
Statement st=conn.createStatement();
ResultSet result=st.executeQuery(sql);
result.close();
st.close();
conn.close();
} catch(Exception e) {
e.printStackTrace();
}
}
与c3p0代码非常类似,这里就不说了。
2.修改main函数调用方式,也是做10次查询,100次查询,1000次查询,每种查询重复100次的实验。
package com.test.jdbc.main;
import java.io.IOException;
import com.alibaba.druid.pool.DruidDataSource;
import com.test.jdbc.dao.TestDAO;
import com.test.jdbc.dao.impl.TestDAOImpl;
public class Main2 {
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 = "dba";
public static void main(String[] args) throws IOException {
TestDAO testDAO = new TestDAOImpl();
DruidDataSource dds = getDruidDataSource();
// 运行100次
for (int i = 0; i < 100; i++) {
queryDruid(testDAO, dds, 1000);
}
}
/**
* 获取Druid数据源
* @return
*/
public static DruidDataSource getDruidDataSource() {
DruidDataSource dds = new DruidDataSource();
dds.setUsername(user);
dds.setUrl(jdbcUrl);
dds.setPassword(passwd);
dds.setDriverClassName(driver);
return dds;
}
public static void queryDruid(TestDAO testDAO, DruidDataSource dds,
int count) {
Integer usrId = 9900;
long startMillis = System.currentTimeMillis();
// 测试c3p0查询
for (int i = 0; i < count; i++) {
testDAO.getUsrInfoWithDruid(dds, usrId);
}
long endMillis = System.currentTimeMillis();
System.out.println(endMillis - startMillis);
}
}
将运行结果复制到excel表格中,利用excel的图表功能生成几种测试的耗时波动图表(单位:毫秒):
1.查询10次数据库,重复100次结果:
2.查询100次数据库,重复100次结果:
3.查询1000次数据库,重复100次结果:
平均值:
10次查询:47.5毫秒
100次查询:493.5毫秒
1000次查询: 5162毫秒
在负载较小的情况下Druid的优势比较明显,在大规模查询情况下也表现出来比较好的性能,至少不比c3p0差。