博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

我们知道JDBC是连接数据库的基石,JDBC为Java访问数据库提供了简单、易用的功能特性。通常我们使用JDBC获取数据库连接时,只需要配置几步必要的参数就可以,虽然我们获取了连接,但是这个连接的获取却来自不易。

为什么说来之不易呢,也许你会觉得,我的代码连接数据库都是非常快的啊,叮,它就能给我查询出来想要的结果。这是没错的,通常这是在我们本地调试的情况下,这个状态下连接数据库几乎没有并发连接情况,这个时候是最理想的状态。但一个服务器不可能仅在本地使用,所以就有以下这种情况。

如果我们将数据库发布到云服务器上,现在有成千上万的用户在同时访问数据库,如果你的服务器不是特别高端,或者说在一个配置不咋样的服务器上来同时访问,每次访问数据库 Connection 就会被加载到内存中,当在庞大的并发量下,你的服务器就会boom(奔溃了)。如果不限制并发连接的数量,那系统就会毫无顾及的一直将资源消耗下去,直到它内存溢出。

例如下面获取数据库连接的代码:

 @Deprecatedpublic static Connection getConnection() throws Exception {String driver = null;String jdbcUrl = null;String user = null;String password = null;InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(inputStream);driver = properties.getProperty("driver");jdbcUrl = properties.getProperty("jdbcUrl");user = properties.getProperty("user");password = properties.getProperty("password");Class.forName(driver);return (Connection) DriverManager.getConnection(jdbcUrl, user, password);}
  • 数据库连接池

就如上面所说的那样,这种实现方式去获取连接,每次我们一关闭连接又得重新来获取,显得有点鸡肋,而且无法控制并发数量,一般在企业开发中是不会用这种方式去获取数据库连接的。所以,我们就引入了数据库连接池(Connection Pool)的概念。

什么是数据库连接池呢?看名词的字面意思,就是存储数据库连接的一个池子,和线程池的概念类似。一个存放数据库连接的池子,它应该有大小(连接数量)、进出水量(连接的并发量)、不能溢出(连接最大数量)、不能干涸(连接最小数量)等等属性。

关于数据库连接池的一些官方介绍:

  • 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
  • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
  • 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

一、优点

  1. 资源重用,由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
  2. 更快的系统反应速度,数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
  3. 新的资源分配手段,对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
  4. 统一的连接管理,避免数据库连接泄露 在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

二、开源工具

数据库连接池既然如此重要,那么一些开源组织也已经为我们准备好了两种开源的数据库连接池,我们不需要自己写数据库连接池,拿来就可以使用。这两种分别是:DBCP 、C3P0

1、DBCP连接池

DBCP(database connection pool),是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool

DBCP与JDBC一样,提供两种可连接的方式,一种是通过代码的方式(局限性比较大)。

 @Testpublic void dbcpTest() {BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/person");dataSource.setUsername("root");dataSource.setPassword("123456");// 指定初始化的连接数dataSource.setInitialSize(50);// 设置允许被同时连接的最大数,意味着同一时刻可以并发连接的最大数dataSource.setMaxTotal(20);// 设置向数据库连接时延迟的最长时间,超过该时间则连接失败dataSource.setMaxWaitMillis(5 * 1000);// 设置空闲时最小能保持的连接数,在连接关闭时,多余的连接数将在连接池中销毁dataSource.setMinIdle(5);try {Connection conn = dataSource.getConnection();System.out.println(conn);System.out.println("连接成功了");} catch (SQLException e) {e.printStackTrace();}}

另一种则是通过配置文件的方式:dbcp.properties

通过代码加载配置文件并连接

 @Testpublic void dbcpTest2() throws Exception {Properties properties = new Properties();InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("dbcp.properties");properties.load(inStream);BasicDataSource dataSource = new BasicDataSourceFactory().createDataSource(properties);Connection conn = dataSource.getConnection();System.out.println(conn);System.out.println("连接成功了");}

2、C3P0连接池

C3P0,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等,这个被推荐使用,它需要的库如下:

通过代码连接:

 @Testpublic void c3p0Test() throws Exception{ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass("com.mysql.jdbc.Driver");cpds.setJdbcUrl("jdbc:mysql://localhost:3306/person");cpds.setUser("root");cpds.setPassword("123456");Connection conn = cpds.getConnection();System.out.println(conn);System.out.println("连接成功了");}

C3P0比较特殊,它可以通过XML文件来配置连接属性,并且规定为:c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><named-config name="jdbcConfig"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/person</property><property name="user">root</property><property name="password">123456</property><!-- 当连接数量用尽时,可定期的增量数 --><property name="acquireIncrement">10</property><!-- 数据库初始化时,需要初始化连接池中连接的数量 --><property name="initialPoolSize">100</property><!-- 连接池的最小连接数 --><property name="minPoolSize">10</property><!-- 连接池的最大连接数 --><property name="maxPoolSize">200</property><!-- 连接池中 Statement 的最大个数 --><property name="maxStatements">20</property><!-- 连接池中每个连接可以同时使用的 Statement 的个数 --><property name="maxStatementsPerConnection">5</property></named-config>
</c3p0-config>

连接代码:

 @Testpublic void c3p0Test2() throws Exception{DataSource dataSource = new ComboPooledDataSource("jdbcConfig");Connection conn = dataSource.getConnection();System.out.println(conn);System.out.println("连接成功了");}

3、区别

从代码上看,相比之下c3p0的代码更加精简,而且是被推荐于使用,大多第三方开源框架都是基于c3p0来建立连接的。从两个开源库本质特点上来说,它们应用于不同的场景,所以它们拥有各自的特点。

  •     dbcp:无法自动回收空闲的连接,提供最大的连接数,如果连接数超出,则会断开连接。
  •     c3p0,可以自动回收空闲的连接,提供最大的空闲时间,如果超出最大的连接时间,则会断开连接。

C3P0 与 DBCP 数据库连接池使用和比较相关推荐

  1. 使用 spring 集成 dbcp 数据库连接池到 Wowza 插件

    对于 Wowza 扩展插件,很可能需要连接数据库进行一些持久化查询操作,而且也很有可能把各种业务逻辑 bean 进行集中管理起来.本文结合集成 dbcp 数据库连接池到 Wowza 插件的案例,顺带介 ...

  2. springboot+dbcp数据库连接池

    springboot+dbcp数据库连接池 1,连接池配置文件 2,连接工具类 3,测试类测试连接 4,实际调用连接去同步数据 1,连接池配置文件 在resources目录下添加文件dbcp.prop ...

  3. javaweb mysql 连接池 c3p0 配置_javaWeb_JDBC_c3p0数据库连接池

    JDBC_c3p0数据库连接池 1.一个基本的c3p0数据库连接池 /** * 一个基本的从池c3p0数据库连接池 */ public static void testC3P0() throws Ex ...

  4. DBCP 数据库连接池的实现

    DBCP数据源 DBCP 是 Apache 软件基金组织下的开源连接池实现,要使用DBCP数据源,需要应用程序应在系统中增加如下两个 jar 文件: Commons-dbcp.jar:连接池的实现 C ...

  5. DBCP数据库连接池技术

    1 mysql版本 2 导入jar包版本,采用配置文件连接时,dbcp.properties文件放到src目录下 3 代码 public class DBCPTeset {@Testpublic vo ...

  6. 03_dbcp数据源依赖jar包,DBCP中API介绍,不同过dbcp方式使用dbcp数据库连接池,通过配置文件使用dbcp数据库连接池

     DBCP数据源 使用DBCP数据源,需要导入两个jar包 Commons-dbcp.jar:连接池的实现 Common-pool.jar:连接池实现的依赖库. 导入mysql的jar包. DBC ...

  7. 在Spring 中配置DBCP数据库连接池

    EmployeeDao 代码 import java.util.List; import java.util.Map;import org.springframework.context.Applic ...

  8. Servlet+MySQL使用DBCP数据库连接池实现用户登录

    首先准备数据库数据和登录页面 创建user数据表并且插入几条数据 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (`id` int(11) NOT ...

  9. DBCP数据库连接池的使用

    2019独角兽企业重金招聘Python工程师标准>>> package tk.dong.connectionPool;import java.io.IOException; impo ...

最新文章

  1. IPv6静态路由怎么配置?
  2. 视频质量评价:挑战与机遇
  3. MONO,原来你是水中月
  4. mysql重启,全网独家首发!
  5. java 注解object_JPA之常用 基本注解
  6. 最近在做中文的全文检索(中文搜索引擎)
  7. 数据仓库模型数据仓库四大模型
  8. 【VS开发】ClientToScreen 和ScreenToClient 用法
  9. 软件各生命周期所用的工具
  10. 关于论文写作中的人名缩写问题
  11. 机器学习:多重共线性
  12. [产品规划]行业公司如何做产品
  13. SendKeys.SendWait()用法
  14. jieba分词使用方法
  15. quartz的schedulerFactory实现解析
  16. 创新案例分享 | 建设一体化智能化公共数据平台,赋能数字化改革
  17. Spring Kafka实战(3)—message listener创建方式探讨
  18. 从“弃儿”到大神,神经网络之父Hiton说人类就是非常精美的机器 | AI英雄
  19. CMake加入第三方库
  20. 硬件开发设计 - 焊接电路板,介绍焊接概念,焊接步骤,常见错误,难点等

热门文章

  1. GET和POST请求的区别
  2. 利用群晖nas备份华为手机数据
  3. 1. 将数据导入到前置数据库中(MySQL)
  4. gh-ost的原子rename
  5. 我国各城市间航空班次
  6. 哪个linux系统最安全,Linux系统是不是最安全的系统?
  7. GStreamer appsrc 等插件实现视频音频混流,录制和推流
  8. ZYNQ芯片AXI 协议和PL和PS接口互联
  9. python:pyecharts地图功能,并解决显示不全或只显示南海诸岛问题解决
  10. 关于echarts中南海诸岛的显示问题