概述:

在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接。通常,与数据库服务进行通信的网络协议无需由应用程序本身实现。

原因有三:

  1. 实现复杂度大,需要充分理解和掌握相应的通信协议。
  2. 代码难以复用,每个应用程序都需要独立实现一套对应的网络协议(不同公司之间,同一公司的不同技术栈之间难以复用实现相同协议的代码)
  3. 性能难以保证,不同的网络协议实现可能存在巨大的性能差距。

正因为如此,所以现实的实现方式是:

首先,定义网络协议标准,这样只要支持这个标准协议的数据库就可以使用相应的客户端与之通信。

其次,将实现这个标准协议的客户端独立为一个通信库,这样只需要在应用程序中使用这个通信组件库就可以方便地实现与数据库进行交互。

通常,我们将实现了网络协议的通信库称之为数据库驱动程序。当然,对于不同的编程语言,需要对应编写相应的数据库驱动实现。以与关系型数据库通信为例,在Java中实现的驱动程序为JDBC,Python中的驱动程序为MySQLdb。

由于通过TCP与数据库建立网络连接的代价非常高昂,而且耗时(TCP建立连接需要“三次握手”,断开连接需要“四次握手”)。所以在实践中通常不直接单独使用连接进行数据库操作,而是使用连接池的方式,这主要是处于以下两方面的考虑:

  1. 应用程序本身需要更低的响应时间,如果每次数据库操作都需要经过“建立连接->通信(增删改查)->断开连接”这个过程,那么势必会导致响应延时的增加。
  2. 避免服务器资源被耗尽,随着业务量的增大,对应的数据库操作必然会随之增加,如果对客户端的连接数不加以控制,可能会导致数据库服务器的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)的更多相关文章

  1. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)

    主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...

  2. java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、

    一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...

  3. .数据库连接池技术:DBCP和C3P0

    数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...

  4. java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)

    复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用:      由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...

  5. spring配置数据库连接池druid

    连接池原理 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连 ...

  6. 数据库连接池Druid的介绍,配置分析对比总结

    Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...

  7. 数据库连接池druid

    推荐一个带监控的数据库连接池druid,阿里的,据说比c3p0连接池性能要好点,主要是带sql,spring,uri等访问监控,比较直观地址: https://github.com/alibaba/d ...

  8. 项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...

  9. 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc

    背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...

  10. 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)

    https://blog.csdn.net/qq_31125793/article/details/51241943 背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推 ...

随机推荐

  1. http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,

    http://www.narkii.com/club/forum-46-1.html  纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,

  2. Docker系列(七):Docker图形化管理和监控

    Docker管理工具之官方三剑客 Docker Machine是什么鬼 从前 现在 你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其 能运行Docker容器. Docke ...

  3. jquery对于ajax的封装

    第一层封装 $.ajax({ 属性名:值,属性名:值}) /* url: 请求服务器地址 data:请求参数 dataType:服务器返回数据类型 error 请求出错执行的功能 success 请求 ...

  4. layui表格监听开关并获取改行id

    ,{field:'sex', title:'性别', width:85, templet: '#switchTpl', unresize: true} <script type="te ...

  5. 09_springmvc图片上传

    一.上传图片 1.需求 在修改商品页面,添加上传商品图片的功能 2.springmvc中对多部件类型解析 在页面form中提交enctype="multipart/form-data&quo ...

  6. pip的使用方法简介

    pip是Python包管理工具,它提供了对Python包的查找.下载.安装.卸载的功能 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. 以下是pip常用命令 显示版本 ...

  7. 深夜Python - 第2夜 - 爬行

    深夜Python - 第2夜 - 爬行 我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口 ...

  8. axios解决调用后端接口跨域问题

    vue-cli通过是本地代理的方式解决接口跨域问题的.但是在vue-cli的默认项目配置中这个代理是没有配置的,如果现在项目中使用,必须手动配置config/index.js文件 ... proxyT ...

  9. JS数组 团里添加新成员(向数组增加一个新元素)只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素。myarray[5]=88;

    团里添加新成员(向数组增加一个新元素) 上一节中,我们使用myarray变量存储了5个人的成绩,现在多出一个人的成绩,如何存储呢?  只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素. my ...

  10. python 请求测试环境的https接口地址报SSL错误验证,访问不了

    解决文案: response = requests.post(url, data=payload, json=None, headers=headers,verify=False)print(resp ...