JDBC连接池技术与Druid
由于数据库连接是一种资源,这种资源在使用前必须先创建,而这个创建过程是存在时间和空间的开销的,如果每次在执行数据库访问时都创建连接,并且使用完后要关闭连接,这个过程必然是效率低下的;因此,在实际开发中可以考虑在进行数据库操作前,先提前创建并维护一批数据库连接对象,当需要使用时,从这批对象中获取一个连接,用完之后再返还,从而避免了不必要的时间开销,提高程序的运行效率,这种技术在JDBC中称之为连接池技术(Connection Pool).
目前比较常用的连接池技术包含:
- apache-DBCP
- C3P0(Spring/Hibernate框架在使用)
- Proxool
- Druid(号称全世界最快的连接池,由alibaba开发)
这里我们分别使用Druid和DBCP连接池:
Druid连接池使用
使用前先导入Druid的依赖:druid-1.1.9.jar
public class DruidPoolDemo {
//声明druid连接池的数据源
public static DruidDataSource dataSource;
static{
init();
}
public static void init(){
//创建连接池对象
dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//设置最大连接数
dataSource.setMaxActive(10);//CUP*2+1
//设置最小的闲置连接数
dataSource.setMinIdle(1);
//设置初始的连接数
dataSource.setInitialSize(2);
//最长等待连接时间(MS)
dataSource.setMaxWait(10000);
}
public static synchronized Connection getConn(){
//确保连接池是单例
if(dataSource == null || dataSource.isClosed()){
//重新初始化连接池
init();
}
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws InterruptedException, SQLException {
Connection conn1 = getConn();
Connection conn2 = getConn();
Connection conn3 = getConn();
Connection conn4 = getConn();
Connection conn5 = getConn();
System.out.println(conn1);
System.out.println(conn2);
System.out.println(conn3);
System.out.println(conn4);
System.out.println(conn5);
Thread.sleep(5000);
conn3.close();
Connection conn6 = getConn();
System.out.println("连接获取--》"+conn6);
}
}
DBCP连接池使用(DBCP2)
使用前需导入相关依赖:
public class DBCPPoolDemo {
public static BasicDataSource dataSource;
static{
init();
}
public static void init(){
dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//设置初始连接池中的连接数
dataSource.setInitialSize(2);
//设置最大连接数
dataSource.setMaxTotal(5);
//设置最小的闲置连接
dataSource.setMinIdle(1);
//最大等待连接时间
dataSource.setMaxWaitMillis(10000);
}
public static Connection getConn(){
if(dataSource == null || dataSource.isClosed()){
init();
}
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws InterruptedException, SQLException {
Connection conn1 = getConn();
Connection conn2 = getConn();
Connection conn3 = getConn();
Connection conn4 = getConn();
Connection conn5 = getConn();
System.out.println(conn1);
System.out.println(conn2);
System.out.println(conn3);
System.out.println(conn4);
System.out.println(conn5);
Thread.sleep(5000);
//回收连接
conn3.close();
Connection conn6 = getConn();
System.out.println(conn6);
}
}