JDBC连接池技术与Druid

JDBC连接池技术与Druid

     由于数据库连接是一种资源,这种资源在使用前必须先创建,而这个创建过程是存在时间和空间的开销的,如果每次在执行数据库访问时都创建连接,并且使用完后要关闭连接,这个过程必然是效率低下的;因此,在实际开发中可以考虑在进行数据库操作前,先提前创建并维护一批数据库连接对象,当需要使用时,从这批对象中获取一个连接,用完之后再返还,从而避免了不必要的时间开销,提高程序的运行效率,这种技术在JDBC中称之为连接池技术(Connection Pool).

JDBC连接池技术与Druid_第1张图片

 目前比较常用的连接池技术包含:

  • 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);
	}
}

 

你可能感兴趣的:(MySql数据库)