JDBC 数据库连接池:
1. 必要性:
1) 再使用开发基于数据库的 web 程序时,传统的模式基本是按以下步骤:
-在主程序中建立数据库连接
-进行 sql 操作
-断开数据库连接
这种模式开发,存在的问题:
①普通的 JDBC 数据库连接使用 DriverManager 来获取,每次向数据库建立连接 的时候都要将 Connection 加载到内存中,在验证用户名和密码(得花费 0.05~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完后在断开连接。这样的方式将会消耗大量的 资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时又几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。
②对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将导致重启数据库。
③这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌的分配出去。如连接过多,也可能导致内存泄露,服务器崩溃。
2. 数据库连接池的基本思想:为数据库连接建立一个“缓冲池”。 预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后再放回去。
3. 数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
/**
* 1. 加载Properties 配置文件:配置文件中的键需要来自 BasicDataSource 的属性
* 2. 调用 BasicDataSourceFactory 的 createDataSource 方法创建 DataSource实例
* 3. 从 DataSource 实例中获取数据库连接
* @throws Exception
*/
@Test
public void testDBCPWithDataSourceFactory() throws Exception{
Properties properties = new Properties();
InputStream inStream = testBatch.class.getClassLoader()
.getResourceAsStream("dbcp.properties");
properties.load(inStream);
javax.sql.DataSource dataSource =
BasicDataSourceFactory.createDataSource(properties);
System.out.println(dataSource.getConnection());
BasicDataSource basicDataSource = (BasicDataSource) dataSource;
System.out.println(basicDataSource.getMaxWait());
}
/**
* 使用 DBCP 数据库连接池
* 1. 加入 jar 包(两个 jar 包)。 依赖于 Commons Pool
* 2. 创建数据库连接池
* 3. 为数据源实例指定必须的属性
* 4. 从数据源中获取数据库连接
* @throws Exception
*/
@Test
public void testDBCP() throws Exception{
BasicDataSource dataSource = null;
//1.创建 DBPC 数据源实例
dataSource = new BasicDataSource();
//2.为数据源实例指定必须的属性
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql:///mydata");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//3. 指定数据源的一些可选的属性
//1). 指定数据库连接池中初始化连接数的个数
dataSource.setInitialSize(10);
//2). 指定最大的连接数:同一时刻可以同时向数据库申请的连接数
dataSource.setMaxActive(50);
//3). 指定最小连接数:在数据库连接池中保存的最少的空闲连接的数量
dataSource.setMinIdle(5);
//4). 等待数据库连接池分配连接的最长时间。单位为毫秒。超出该时间将抛出异常
dataSource.setMaxWait(1000 * 5);
//4.从数据源中获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection.getClass());
}
dbcp.properties
username=root
password=root
url=jdbc:mysql:///mydata
driverClassName=com.mysql.jdbc.Driver
initialSize=10
maxActive=50
minIdle=5
maxWait=5000