数据库连接池 - (druid、c3p0、dbcp)
概述:
在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接。通常,与数据库服务进行通信的网络协议无需由应用程序本身实现。
原因有三:
- 实现复杂度大,需要充分理解和掌握相应的通信协议。
- 代码难以复用,每个应用程序都需要独立实现一套对应的网络协议(不同公司之间,同一公司的不同技术栈之间难以复用实现相同协议的代码)
- 性能难以保证,不同的网络协议实现可能存在巨大的性能差距。
正因为如此,所以现实的实现方式是:
首先,定义网络协议标准,这样只要支持这个标准协议的数据库就可以使用相应的客户端与之通信。
其次,将实现这个标准协议的客户端独立为一个通信库,这样只需要在应用程序中使用这个通信组件库就可以方便地实现与数据库进行交互。
通常,我们将实现了网络协议的通信库称之为数据库驱动程序。当然,对于不同的编程语言,需要对应编写相应的数据库驱动实现。以与关系型数据库通信为例,在Java中实现的驱动程序为JDBC,Python中的驱动程序为MySQLdb。
由于通过TCP与数据库建立网络连接的代价非常高昂,而且耗时(TCP建立连接需要“三次握手”,断开连接需要“四次握手”)。所以在实践中通常不直接单独使用连接进行数据库操作,而是使用连接池的方式,这主要是处于以下两方面的考虑:
- 应用程序本身需要更低的响应时间,如果每次数据库操作都需要经过“建立连接->通信(增删改查)->断开连接”这个过程,那么势必会导致响应延时的增加。
- 避免服务器资源被耗尽,随着业务量的增大,对应的数据库操作必然会随之增加,如果对客户端的连接数不加以控制,可能会导致数据库服务器的CPU和内存资源被大量的网络连接快速耗尽,这样将导致服务不可用。

在Java中使用得比较流行的数据库连接池主要有:DBCP,c3p0,druid。
另外,不论使用什么连接池,低层都是使用JDBC连接,即:在应用程序中都需要加载JDBC驱动程序。
Druid:
概述:druid:阿里出品,淘宝和支付宝专用数据库连接池,支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。
主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。
Druid针对Oracle和MySql做了特别优化。
依赖Jar包:不分版本号
● druid-1.1.5.jar
● mysql-connector-java-8.0.14.jar
DruidDataSource dataSource = new DruidDataSource();
//获取驱动
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
//建立连接
dataSource.setUrl("jdbc:mysql://localhost:3306/class38?serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456");
try {
//获取连接
DruidPooledConnection conn = dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement("insert into student values(?,?,?,?)");
statement.setInt(1, 13);
statement.setString(2, "小明");
statement.setString(3, "数据库");
statement.setInt(4, 150);
int i = statement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
设置配置文件:druid.properties
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/class38?serverTimezone=Asia/Shanghai
username = root
password = 123456
通过配置文件实现连接:
//建立工厂
DruidDataSourceFactory factory = new DruidDataSourceFactory();
Properties p = new Properties();
InputStream in = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
try {
//读取配置文件中的信息
p.load(in);
DataSource dataSource = factory.createDataSource(p);
Connection conn = dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement("select * from student");
ResultSet result = statement.executeQuery();
while(result.next()){
System.out.println(result.getInt(1)+","+result.getString(2)+","+result.getString(3)+","+result.getInt(4));
}
} catch (Exception e) {
e.printStackTrace();
}
C3P0:
开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,c3p0有两种数据源管理方式,一种是通过程序变本身来进行管理,还有一种是通过容器管理,
c3p0有自动回收空闲连接功能。单线程,性能较差,适用于小型系统,代码600KB左右。
依赖Jar包:不分版本号
● mysql-connector-java-8.0.14.jar
● c3p0-0.9.5.2.jar
● mchange-commons-java-0.2.11.jar
① 连接使用C3P0
1.1 - 使用Java API方式配置c3p0
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/class38?serverTimezone=Asia/Shanghai");
dataSource.setUser("root");
dataSource.setPassword("123456");
Connection conn = dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement("delete from student where id=?");
statement.setInt(1, 11);
int i = statement.executeUpdate();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
}
}
1.2 - 直接在连接池中获取连接
DataSource ds = new ComboPooledDataSource();/
try {
Connection connection = ds.getConnection();
String sql = "select * from goods";
PreparedStatement prepareStatement = connection.prepareStatement(sql);// 设置sql语句
ResultSet executeQuery = prepareStatement.executeQuery();// 运行
while (executeQuery.next()) {
System.out.println("商品:" + executeQuery.getObject(2).toString());
}
executeQuery.close();
prepareStatement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
★1.3 - 使用DBUtils工具连接:需要配置XML数据源,使用工具连接不需要close
//获取数据源,读取的是C3P0-config默认配置创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//创建QueryRunner带参对象
QueryRunner queryRunner = new QueryRunner(ds);
//SQL UPDATE语句
String sql = "DELETE FROM type WHERE id in(?,?)";
//执行UPDATE语句,返回一个int类型的结果
int update = queryRunner.update(sql,6,7);
System.out.println(update);
② 使用c3p0.properties文件进行配置
数据源配置:c3p0.properties
需要在classpath路径下添加配置文件:c3p0.properties,内容如下:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://host:port/db
c3p0.user=root
c3p0.password=
c3p0.minPoolSize=5
c3p0.maxPoolSize=20
c3p0.acquireIncrement=5
在应用程序中只需要直接创建ComboPooledDataSource对象即可(c3p0会自动从classpath加载c3p0.properties中的配置信息):
ComboPooledDataSource cpds = new ComboPooledDataSource();
Connection conn = cpds.getConnection();
query(conn);
cpds.close();
注意: 使用c3p0.properties作为配置文件时,每个参数的name前缀必须是“c3p0”,如:“c3p0.driverClass=com.mysql.jdbc.Driver”。
★ ③ 使用c3p0-config.xml文件进行配置
数据源配置:c3p0-config.xml
使用这种方式会比使用c3p0.properties更加高级,支持配置多个数据源,同样需要在classpath路径下添加文件:c3p0-config.xml
<c3p0-config>
<!-- 这是默认配置信息 -->
<default-config>
<!-- 连接四大参数配置 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl"><!--CDATA里面的特殊符号都当字符串处理-->
<![CDATA[jdbc:mysql://localhost:3306/cakeshop?useUnicode=true&character=UTF-8&serverTimezone=GMT%2B8&useSSL=true]]>
</property>
<property name="user">用户名</property>
<property name="password">密码</property>
<!-- 池参数配置 -->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
在应用程序中只需要直接创建ComboPooledDataSource对象即可(c3p0会自动从classpath加载c3p0-config.xml中的配置信息):
// 使用默认数据源
// ComboPooledDataSource cpds = new ComboPooledDataSource(); // 使用指定名称的数据源
ComboPooledDataSource cpds = new ComboPooledDataSource("myDataSource");
Connection conn = cpds.getConnection();
query(conn);
cpds.close();
DBCP:
由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。
单独使用dbcp需要3个包,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。
单线程,并发量低,性能不好,适用于小型系统。
依赖Jar包:不分版本号
● mysql-connector-java-8.0.14.jar
● commons-dbcp2-2.4.0.jar
● commons-pool2-2.6.2.jar
● commons-logging-1.2.jar
//创建连接池对象
BasicDataSource dataSource = new BasicDataSource();
//设置参数
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/class38?serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456");
try {
//获取连接对象
Connection conn = dataSource.getConnection();
//生成预编译Statement对象
PreparedStatement statement = conn.prepareStatement("insert into student values(null,?,?,?)");
statement.setString(1, "帅帅");
statement.setString(2, "大数据");
statement.setInt(3, 100);
//执行sql语句
int i = statement.executeUpdate();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
}
配置文件内容:dbcp.properties
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/class38?serverTimezone=Asia/Shanghai
username = root
password = 123456
通过Properties配置文件连接:
BasicDataSourceFactory factory = new BasicDataSourceFactory();
Properties p = new Properties();
try {
InputStream in = DBCPDemo.class.getClassLoader().getResourceAsStream("dbcp.properties");
//加载配置文件
p.load(in);
//创建一个对象并返回
DataSource dataSource = factory.createDataSource(p);
Connection conn = dataSource.getConnection();
PreparedStatement statement = conn.prepareStatement("select * from student");
ResultSet result = statement.executeQuery();
while(result.next()){
System.out.println(result.getInt(1)+","+result.getString(2)+","+result.getString(3)+","+result.getInt(4));
}
} catch (Exception e) {
e.printStackTrace();
}
@ 转载至网络
数据库连接池 - (druid、c3p0、dbcp)的更多相关文章
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
- .数据库连接池技术:DBCP和C3P0
数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...
- java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)
复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用: 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...
- spring配置数据库连接池druid
连接池原理 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连 ...
- 数据库连接池Druid的介绍,配置分析对比总结
Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...
- 数据库连接池druid
推荐一个带监控的数据库连接池druid,阿里的,据说比c3p0连接池性能要好点,主要是带sql,spring,uri等访问监控,比较直观地址: https://github.com/alibaba/d ...
- 项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
- 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...
- 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
https://blog.csdn.net/qq_31125793/article/details/51241943 背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推 ...
随机推荐
- Mybatis笔记 - 原始Dao开发方法
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.原始Dao的开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员需要 编写 Dao接口 和 ...
- 使用Maven命令行下载依赖库
这篇文章,不是教大家如何新建maven项目,不是与大家分享Eclipse与Maven整合. 注意:是在命令行下使用Maven下载依赖库. 废话不说,步骤如下: 1.保证电脑上已成功安装了JDK.运行j ...
- day4:Python列表(list)元组( tuple)字典(dict)
列表----list 列表:中括号,每个元素用‘,’分割,列表里面也可以嵌套列表,列表里面可以包含数字,字符串,布尔值等,也就是元素的集合 例:test = [2,4,'sun','yao'] #索引 ...
- 本地项目通过 git 同步到 github
1. github创建仓库并克隆仓库地址 2. 在本地通过git命令:git clone <仓库地址> 生成github仓库文件夹 3. 将本地项目复制到该文件夹 4. 通过git命令:g ...
- ">/dev/null 2>&1 "是什么意思
在Linux中: 0:表示键盘输入(stdin) 1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) shell命令:command >/dev/null 2&g ...
- springcloud(十五):服务网关zuul
前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...
- mybatis-spring多数据源配置
mybatis-spring多数据源配置 1.注意事项:在MapperScannerConfigurer里配置的时候,每个数据源的mapper接口应放到不同的包中,下面的例子中用粗体标明,另外,对于m ...
- 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件
title author date CreateTime categories C# 极限压缩 dotnet core 控制台发布文件 lindexi 2019-10-04 14:59:36 +080 ...
- 在 /proc 里实现文件
所有使用 /proc 的模块应当包含 <linux/proc_fs.h> 来定义正确的函数. 要创建一个只读 /proc 文件, 你的驱动必须实现一个函数来在文件被读时产生数据. 当 某个 ...
- 五. Arrow Function 箭头函数
箭头函数三大好处: 1. 简明的语法 举例: 如果只有一个参数,可以不加(),多个参数用 "," 隔开 2. 隐式返回 首先说下什么是显示返回,显示返回就是 return 加上你要 ...