数据库连接池 - (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 背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推 ...
 
随机推荐
- LTE基本架构
			
1.LTE结构 这是一张非常有名的LTE架构图,从图中可以看出,整个网络构架被分为了四个部分: (1)UE就可以看作是我们的手机终端 (2)PDN可以看作是网络上的服务器 (3)E-UTRAN可以看 ...
 - Java 11 发布计划来了,已确定 3个 新特性!!
			
Oracle 已经发布了 Java Development Kit 10,下一个版本 JDK 11 也在准备之中了.按照 Java 新的版本发布标准,Java 11 将在 6 个月后到来,现在它还只有 ...
 - <随便写>进程基本知识
			
from multiprocessing import Process, Queue,Pool import time import os def producer(q): for i in rang ...
 - 面试系列14 redis的过期策略都有哪些
			
(1)设置过期时间 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效. 如果假设你 ...
 - java_Collections工具
			
** * Collections.addAll(List,多个元素): * Collections.shuffle(List):打乱顺序 * sort(List):将集合中元素按照默认规则排序 * s ...
 - Axios的get和post请求写法
			
执行get请求 // 为给定 ID 的 user 创建请求 axios.get('/user?ID=12345') .then(function (response) { console.log(re ...
 - xcart小数点位数
			
xcart小数点的位数默认是2位,有时候需要根据需要更改位数:一开始以为把数据库中的数据类型的位数更改过后,就能生效,结果发现xcart在程序中作了限制,只能是2位.那么只能通过更改程序的方式来更改了 ...
 - php计算网段内所有IP,分配子网段
			
由于最近业务需要,写了个获取网段内所有IP的函数,以及分配可用子网段的函数 /** * 根据网段获取计算所有IP * @param string $segment 网段 '139.217.0.1/24 ...
 - 05_springmvc参数绑定
			
一.参数绑定的过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接收.而不 ...
 - 2019-2-26-SublimeText-快速打开当前文件的文件夹
			
title author date CreateTime categories SublimeText 快速打开当前文件的文件夹 lindexi 2019-02-26 18:45:29 +0800 2 ...