今天我用dbcp写了一个测试程序,测试成功了。于是我想测试一下它的性能,我分别用JDBC和DBCP编写了获得数据库连接的方法:可是测试结果显示JDBC用时比DBCP还少,这是为什么呢?我很困惑,希望各位大侠帮帮我,谢谢!代码如下:
package test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;public class TestMain { private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:orcl92";
private String user = "scott";
private String pwd = "tiger"; private Connection conn = null;
private PreparedStatement pstm = null;
private ResultSet rs = null; public static void main(String[] args) { String sql = "SELECT * FROM book"; TestMain test = new TestMain(); long before = System.currentTimeMillis();
/*
 * for(int i=0; i < 50; i++){
 * 
 * Connection conn = test.getConnByJDBC(); test.executeQuery(conn, sql); }
 */
for (int i = 0; i < 50; i++) {

DataSource ds = test.getConnByDBCP();
Connection con = null;
try {
con = ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("建立数据源连接出错");
e.printStackTrace();
}
test.executeQuery(con, sql);
}
long after = System.currentTimeMillis();
System.out.println(after - before);
} public Connection getConnByJDBC() { try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pwd);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("数据库驱动加载失败!");
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("数据库连接失败!");
e.printStackTrace();
}
return conn;
} public void executeQuery(Connection conn, String sql) { try {
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("bookname"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("创建PreparedStatement对象失败!");
e.printStackTrace();
}
} public DataSource getConnByDBCP() { BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(pwd);
ds.setInitialSize(5); // 初始的连接数;
ds.setMaxActive(100);
ds.setMaxIdle(30);
ds.setMaxWait(1000);
DataSource dataSource = (DataSource) ds;
return dataSource;
}}

解决方案 »

  1.   

    dbcp 主要是在并发的时候展示其强大,并非在这里展示强大,lz可以 如此测试,用50个线程去同时操作数据库,就能看出dbcp 的优势了,那优势不是一般的大。还有一点,lz 可否把自己 dbcp 的例子发给我看看。我很想要 [email protected] 这是我的邮箱!
      

  2.   

    getConnByDBCP()这个方法似乎有点问题,为什么数据源要去重复生成。
    取得任意个连接都只需要一个数据源即可。
      

  3.   

    DBCP这些连接池会有一些额外的操作,比如判断连接数等,你测试这个没什么意义啊,慢不了多少的,倒是到了大量连接的时候DBCP就显示出连接池的好处了
      

  4.   

    dbcp速度应该快些,同时DBCP的bug比较多
      

  5.   

    dbcp要初始化连接池,比单个jdbc当然要慢了你用100个并发一下就看出来了