jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》
数据连接池(Connection Pool)技术, 就是为数据库连接建立一个对象池, 连接对象池中预先创建一定数据的连接. 当应用需要数据库连接时, 直接从连接池中获取, 无须单独创建; 用于之后, 将连接归还给连接池, 无须单独销毁. 应用所需所有的数据库连接由连接池统一进行创建, 分配, 销毁, 管理等.
对于当需要连接时, 自行获取, 用于自行销毁这种自给自足的模式, 有太多的弊端和隐藏的风险:
数据库连接资源没有很好的重用.系统响应较慢, 因为数据库连接的创建与销毁比较耗时当请求并发量大时, 会一瞬间创建很多连接, 占用过多数据库资源, 影响数据库响应时间, 甚至导致数据库服务器瘫痪应用不能控制总的连接数, 可能会导致连接过多, 内存泄露等问题.相较于独立获取数据库连接而已, 数据连接池有太多的好处:
资源重用: 数据库用完之后, 不会立即销毁, 而是归还给数据连接池, 因此可以实现数据连接的重复使用.更快响应: 创建和销毁数据库连接需要网络开销, 比较耗时. 数据库连接技术, 降低了数据连接的创建和销毁过程, 因此可以大幅提升系统响应.统一管理: 数据库连接同一管理, 避免数据库连接滥用等造成的数据泄露通常我们将Datasource 称为数据源, 其实它包含数据连接池和连接池管理两个部分. jdbc 只定义了数据源的规范(DataSource 接口), 具体实现由数据库驱动厂商提供. 当然了, 也有一些知名的开源组织开源了一些非常好用的数据源:
druid: 阿里巴巴开源的一个数据连接池工具, 支持sql监控, 数据库密码加密等功能.c3p0: c3p0是一个非常好用的数据连接池工具, hibernate便是使用c3p0管理数据源的.dbcp: apache 开源的一个数据连接池工具, tomcat 内置使用dbcp.对于dbcp, c3p0 等数据源, 用法大同小异, 笔者就拿一个比较常用的c3p0 举例. c3p0 相关文档:
官方使用文档: https://www.mchange.com/projects/c3p0/配置项说明: https://www.mchange.com/projects/c3p0/#configuration_propertiesgitHub: https://github.com/swaldman/c3p0https://mvnrepository.com/artifact/com.mchange/c3p0c3p0 数据源只需要引入c3p0 一个核心包即可.
<!-- 引入mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!-- 引入c3p0 依赖--> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>笔者使用两种常用的方式来设置c3p0的配置项信息.
public class TestC3p0 { // 使用类路径下的c3p0-config.xml 中配置的参数信息来创建 @Test public void test01() throws SQLException { String dataSourceName = "myC3p0Pool"; // 1.创建数据源, 指定使用的数据源配置名称 DataSource dataSource = new ComboPooledDataSource(dataSourceName); // 2.获取数据库连接, 获得的是代理对象: com.mchange.v2.c3p0.impl.NewProxyConnection Connection connection = dataSource.getConnection(); // 3. 执行操作 System.out.println(connection.getMetaData().getUserName()); // 4.释放连接, 将连接归还给连接池, 并非直接销毁 connection.close(); } // 通过代码设置数据源配置 @Test public void test02() throws Exception{ // 1. 创建c3p0 数据源, 并设置参数 ComboPooledDataSource c3p0 = new ComboPooledDataSource(); // 设置基本参数 c3p0.setJdbcUrl("jdbc:mysql://localhost:3306/learn-mybatis3?serverTimezone=UTC&characterEncoding=UTF-8"); c3p0.setUser("root"); c3p0.setPassword("root"); c3p0.setDriverClass("com.mysql.jdbc.Driver"); // 设置数据连接池初始化连接数 c3p0.setInitialPoolSize(5); // 设置数据连接池最大连接数 c3p0.setMaxPoolSize(50); // 设置数据连接池最小连接数 c3p0.setMinPoolSize(5); // 设置数据连接池中连接数不够时,一次性获取多少个新的连接 c3p0.setAcquireIncrement(10); // 2. 获取数据库连接, 获得的是代理对象: com.mchange.v2.c3p0.impl.NewProxyConnection Connection connection = c3p0.getConnection(); // 3. 执行数据库操作 System.out.println(connection.getMetaData().getUserName()); // 4. 释放连接, 将连接归还给连接池, 并非直接销毁 connection.close(); } }