之前转载了一个关于连接池的博客:http://blog.csdn.net/qq407388356/article/details/78869653介绍了连接池的原理。后来在Spring整合的项目中使用到了连接池的一些操作。
下面以c3p0连接池与不使用连接池进行一个比较操作,使用maven比较简单获得c3p0的jar包。
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
下面简单demo需要导入相关jar包:c3p0-0.9.1.1.jar。当然还需要mysql驱动的jar包mysql-connector-java-5.1.7-bin.jar。
ConnectionManager.java
c3p0连接池的Manager,通过ConnectionManager.getInstance().getConnection();获得数据库的Connection。
package test_c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
public class ConnectionManager {
//使用单例模式创建数据库连接池
private static ConnectionManager instance;
private static ComboPooledDataSource dataSource;
private ConnectionManager() throws PropertyVetoException{
dataSource = new ComboPooledDataSource();
dataSource.setUser("root"); //用户名
dataSource.setPassword("root"); //密码
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");//数据库地址
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setInitialPoolSize(5); //初始化连接数
dataSource.setMinPoolSize(1);//最小连接数
dataSource.setMaxPoolSize(10);//最大连接数
dataSource.setMaxStatements(50);//最长等待时间
dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒
}
public static final ConnectionManagergetInstance() {
if (instance == null) {
try {
instance = new ConnectionManager();
} catch (Exception e) {
e.printStackTrace();
}
}
return instance;
}
public synchronized final Connection getConnection() {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
Main.java
测试函数,包括使用连接池和不使用连接池的情况。
import test_c3p0.ConnectionManager; import java.sql.*; public class Main { public static void main(String[] args) throws SQLException { System.out.println("使用连接池................................"); for (int i = 0; i < 20; i++) { long beginTime = System.currentTimeMillis(); Connection conn = ConnectionManager.getInstance().getConnection(); query(conn); long endTime = System.currentTimeMillis(); System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime)); } System.out.println("不使用连接池................................"); final String URL = "jdbc:mysql://localhost:3306/test"; final String USER = "root"; final String PASSWORD = "root"; for (int i = 0; i < 20; i++) { long beginTime = System.currentTimeMillis(); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); query(conn); long endTime = System.currentTimeMillis(); System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime)); } } public static void query(Connection conn) { try { PreparedStatement pstmt = conn.prepareStatement("select * from test"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // do nothing... } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
输出:
使用连接池................................
二月 25, 20183:08:59 下午com.mchange.v2.log.MLog <clinit>
信息: MLogclients using java 1.4+ standard logging.
二月 25, 20183:08:59 下午com.mchange.v2.c3p0.C3P0Registry banner
信息:Initializing c3p0-0.9.1.1 [built 15-March-2007 01:32:31; debug? true; trace:10]
二月 25, 20183:09:00 下午com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息:Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource (连接池初始化信息…)
第1次执行花费时间为:1619
第2次执行花费时间为:2
第3次执行花费时间为:2
…
第19次执行花费时间为:3
第20次执行花费时间为:1
不使用连接池................................
第1次执行花费时间为:28
第2次执行花费时间为:26
…
第19次执行花费时间为:19
第20次执行花费时间为:72
明显可以看出使用连接池时,第一次初始化时间比较长,后面获得连接时间很短。而不使用连接池每次都会有一定的耗时(比较平均)。在Javaweb一些应用中,面对海量的查询操作必然需要使用连接池的。