c3p0的使用我们基本已经了解,下面这个测试是用来测试c3p0的性能如何,测试有一定的局限性,仅供参考。大家可以根据项目情况来配置c3p0的各种属性值,配置之后进行测试,最终找到最合理的配置方案。
1.改造我们原来的代码:
将DataSource 提取出来,应为在实际应用之中DataSource是只创建一次,不会每次访问数据库重新创建。我们可以将之声明为static 或像下列代码中一样由外部传入。这种方式类似于Spring 对DataSource 的管理方式。
Statement 与connection 的实例可以有多个只有用的时候才创建,用完需要close() ,否则会出现连接被占用的情况。
package com.test.jdbc.dao.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.test.jdbc.dao.TestDAO;
public class TestDAOImpl implements TestDAO {
/**
* c3p0实现
*/
public void getUsrInfoWithC3P0(ComboPooledDataSource cpds,Integer usrId) {
// c3p0的DataSource实例
String sql="SELECT * FROM USER u WHERE u.USR_ID=" + usrId;
try {
// 获取连接
Connection conn=cpds.getConnection();
Statement st=conn.createStatement();
ResultSet result=st.executeQuery(sql);
result.close();
st.close();
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
2.修改main 函数:
我们做10次,100次,1000次查询数据库操作,每种情况重复100次来观察消耗时间的波动范围,因为查询1万次耗时较多这里就不做实验了。
package com.test.jdbc.main;
import java.beans.PropertyVetoException;
import java.io.IOException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.test.jdbc.dao.TestDAO;
import com.test.jdbc.dao.impl.TestDAOImpl;
public class Main {
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();
ComboPooledDataSource cpds = getC3p0DataSource();
// 运行100次
for (int i = 0; i < 100; i++) {
queryC3p0(testDAO, cpds, 1000);
}
}
/**
* 获取c3p0数据源
*/
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.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
return cpds;
}
public static void queryC3p0(TestDAO testDAO, ComboPooledDataSource cpds,
int count) {
Integer usrId = 9900;
long startMillis = System.currentTimeMillis();
// 测试c3p0查询
for (int i = 0; i < count; i++) {
testDAO.getUsrInfoWithC3P0(cpds, usrId);
}
long endMillis = System.currentTimeMillis();
System.out.println(endMillis - startMillis);
}
}
将运行结果复制到excel表格中,利用excel的图表功能生成几种测试的耗时波动图表(单位:毫秒):
1.查询10次数据库,重复100次结果:
2.查询100次数据库,重复100次结果:
3.查询1000次数据库,重复100次结果:
平均值:
10次查询:61毫秒
100次查询:680毫秒
1000次查询: 5184毫秒