1. 数据库连接池的概念
数据库连接池就是一个存放数据库连接的容器(集合)。
当系统初始化好后,容器被创建,并且容器中会申请一些连接对象。用户访问数据库可以直接从容器中获取连接对象,访问完再将连接对象归还给容器。
2. 数据库连接池的作用
原先用户访问数据库需要向系统底层申请一个连接对象,访问完再将连接对象归还给系统,而向系统底层申请资源是很耗时的,并且这样每次申请释放对系统资源的浪费很大。
使用数据库连接池后,用户访问数据库可以直接从容器中获取连接对象,访问完再将连接对象归还给容器。用户不再需要耗费申请资源的时间了,使用户访问更高效,而且提高了连接对象的复用率,节约了资源。
3. 数据库连接池的实现
-
javax.sql 包下提供了 DataSource 接口,这个接口由数据库厂商去实现,所有的数据库连接池都会实现 DataSource 接口。
DataSource 接口中的方法:
-
获取连接:
Connection getConnection()
-
归还连接:
如果连接对象 Connection 是从连接池中获取的,那么调用 Connection 的 close() 方法,则不会再关闭连接了,而是归还连接给数据库连接池。
-
-
常用的数据库连接池
- C3P0:开源的数据库连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate ,Spring 等。
- Druid:阿里巴巴提供的开源数据库连接池
4. C3P0 数据库连接池
-
C3P0 的使用步骤
-
在 src 下创建 libs 文件夹
-
在 libs 中导入数据库驱动 jar 包,右键 Add as Library
- mysql-connector-java-5.1.37-bin.jar
-
在 libs 中导入 C3P0 的两个 jar 包,右键 Add as Library
- c3p0-0.9.5.2.jar
- mchange-commons-java-0.2.12.jar
-
定义 C3P0 配置文件
名称: c3p0.properties 或者 c3p0-config.xml
路径:直接将文件放在 src 下即可
-
创建 C3P0 数据库连接池对象
// 使用默认的配置读取连接池对象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); // 使用指定名称的配置读取连接池对象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("指定的名称");
-
获取连接对象
Connection connection = comboPooledDataSource.getConnection();
-
-
c3p0-config.xml
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test1</property> <property name="user">root</property> <property name="password">123456</property> <!-- 连接池参数 --> <!-- 初始化申请的连接数量,如果都用完了再申请 --> <property name="initialPoolSize">5</property> <!-- 最大的连接数量,最多只能申请这么多连接对象 --> <property name="maxPoolSize">10</property> <!-- 超时时间,超过这个时间申请不到连接对象就报错 --> <property name="checkoutTimeout">3000</property> </default-config> <!-- 使用指定名称的配置读取连接池对象 --> <named-config name="otherc3p0"> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test1</property> <property name="user">root</property> <property name="password">123456</property> <!-- 连接池参数 --> <!-- 初始化申请的连接数量,如果都用完了再申请 --> <property name="initialPoolSize">5</property> <!-- 最大的连接数量,最多只能申请这么多连接对象 --> <property name="maxPoolSize">8</property> <!-- 超时时间,超过这个时间申请不到连接对象就报错 --> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
5. Druid 数据库连接池
-
Druid 的使用步骤
-
在 src 下创建 libs 文件夹
-
在 libs 中导入数据库驱动 jar 包,右键 Add as Library
- mysql-connector-java-5.1.37-bin.jar
-
在 libs 中导入 Druid 的 jar 包,右键 Add as Library
- druid-1.0.9.jar
-
定义 Druid 配置文件
名称:xxx.properties
路径:可以放在任意目录下(直接将文件放在 src 下也行)
-
加载 Druid 配置文件(与 C3P0 不同,Druid 配置文件需要手动加载)
// 加载配置文件 Properties properties = new Properties(); InputStream resourceAsStream = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(resourceAsStream);
-
创建 Druid 数据库连接池对象(通过工厂类来创建)
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
-
获取连接对象
Connection connection = dataSource.getConnection();
-
-
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/test1 username=root password=123456 initialSize=5 maxActive=10 maxWait=3000
-
定义工具类 JDBCUtils
-
JDBCUtils 的作用
提供获取连接池,获取连接对象,释放资源等方法,简化 JDBC 的使用
-
JDBCUtils 的功能
- 获取连接池
- 通过数据库连接池获取连接对象
- 释放资源
-
编码实现
package com.zt.datasource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtils { // 1.定义静态变量 dataSource private static DataSource dataSource; static { try { // 2.加载配置文件 Properties properties = new Properties(); InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(resourceAsStream); // 3.创建数据库连接池对象,并赋值给 dataSource dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接池方法 */ public static DataSource getDataSource(){ return dataSource; } /** * 通过数据库连接池获取连接对象 */ public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } /** * 释放资源 */ public static void close(ResultSet resultSet, Statement statement,Connection connection) { if(resultSet != null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement != null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(Statement statement,Connection connection) { close(null,statement,connection); } }
-