为了应对企业级的高并发的服务,许多服务器资源都用了池的概念。
内存池、线程池、数据库连接池等等。
本质的理念都是一样的,为了不在对用户进行服务(来一个用户创建一次资源)时资源的浪费,所以预先就创建了一定量的资源,然后交由管理程序进行管理,当池中有空闲的资源即可被用户获得,否则就需等待。
jdbc数据库连接池使用javax.sql.DataSource,DataSource是接口包含了连接池和连接池管理等功能,由服务器、开源组织实现 (tomcat等),
常见的实现有:
1.DBCP
2. C3P0
首先下好两个jar包
commons-dbcp
commons-pool
例子代码较简单不详细说明
配置文件
initialSize=5
maxTotal=5
maxIdle=5
minIdle=5
maxWaitMillis=1000
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/student?useSSL=false
username=root
package top.demo.test;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.commons.dbcp2.DataSourceConnectionFactory;
import java.io.IOException;
import java.sql.Connection;
public class TestDBCP {
public static void main(String argv[]) throws Exception {
//test1();
test2();
}
//基本设置测试
public static void test1() throws SQLException {
//创建DBCP数据源
BasicDataSource dataSource=new BasicDataSource();
//设置驱动 和 连接信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/student?useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("");
//设置初始化连接个数
dataSource.setInitialSize(10);
//设置最大连接个数 负数是没有限制
dataSource.setMaxTotal(50);
//保持空闲的最大连接数。返回池后,将销毁过多的空闲连接
dataSource.setMaxIdle(25);
//设置池中空闲连接的最小数量。当空闲对象回收器运行时,池试图确保minIdle连接可用
dataSource.setMinIdle(5);
//设置等待获取连接的超时时间 超出时间将抛异常
dataSource.setMaxWaitMillis(5*1000);
Connection connection= dataSource.getConnection();
System.out.println(connection);
}
//从配置文件加载配置测试
public static void test2() throws Exception {
//配置文件书写规则为 set方法后的字符且第一个字符小写
Properties properties=new Properties();
properties.load(ClassLoader.getSystemResourceAsStream("dbcp.properties"));
BasicDataSource dataSource= BasicDataSourceFactory.createDataSource(properties);
try {
Connection connection= dataSource.getConnection();
Connection connection2= dataSource.getConnection();
Connection connection3= dataSource.getConnection();
Connection connection4= dataSource.getConnection();
Connection connection5= dataSource.getConnection();
Connection connection6= dataSource.getConnection();
}catch (Exception e) {
// TODO: handle exception
if(e.getMessage().equals("Cannot get a connection, pool error Timeout waiting for idle object" +
""))
{
System.out.println("超时了");
throw e;
}
}
//System.out.println(connection);
}
}