美文网首页
Java 数据库连接池笔记

Java 数据库连接池笔记

作者: 狗子渣渣 | 来源:发表于2018-01-21 11:19 被阅读385次

JDBC

Java 数据库连接(Java Database Connectivity,简称JDBC)是 Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

JDBC 的创建

使用 JDBC 访问数据库的流程:

  1. 加载 JDBC 驱动
  2. 连接数据库
  3. 执行 SQL 查询
  4. 从结果集中提取数据
  5. 处理结果集
  6. 清理环境,关闭所有的数据库资源,释放内存

关于 JDBC 更详细的介绍与使用:Java-MySQL连接

JDBC 的缺点

熟悉 JDBC 编程的,我们知道它存在很多缺点,如:

  1. 数据库连接,使用时创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响了数据库的性能。
  2. 将 sql 语句硬编码到java代码中,如果 sql 语句的修改,需要重新编译java代码,不利于系统的维护
  3. 向 preparedStatement 中设置参数,对占位符位置和参数值,硬编码在代码中,不利于系统的维护。
  4. 从 resultSet 中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统的维护。

针对上述缺点,我们对应的解决方案:

  • 问题1:使用数据库的连接池管理数据库的连接。
  • 问题2:将 sql 语句配置到 xml 配置文件中,即使 sql 变化,不需要对 java 进行重新编译
  • 问题3:将 sql 语句和参数值配置到 xml 中
  • 问题4:将查询的结果自动的映射的 java 的对象

总的来说,我们主要会采用数据库连接池解决数据库频繁链接与释放问题,采用配置文件解决 sql 语句硬编码问题。

数据库连接池

连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对 JDBC 中的原始连接进行了封装,从而方便了数据库应用对于连接的使用(特别是对于事务处理),提高了开发效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。

连接池的操作:

  1. 建立数据库连接池对象(服务器启动)。
  2. 按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  3. 对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  4. 存取数据库。
  5. 关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  6. 释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

自定义数据库连接池

大致了解了数据库连接池的原理与创建方法,我们可以自己编写一个数据库连接池,而编写连接池需实现javax.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

  Connection.getConnection() 

  Connection.getConnection(String username, String password) 

自定义一个类,实现DataSource接口,并实现连接池功能的步骤:

  1. 在自定义类的构造函数中批量创建Connection,并把创建的连接保存到一个集合对象中(LinkedList)。
  2. 在自定义类中实现Connection.getConnection方法,让getConnection方法每次调用时,从集合对象中取出一个Connection返回给用户。
  3. 当用户使用完Connection,不能调用Connection.close()方法,而要使用连接池提供关闭方法,即将Connection放回到连接池之中(把Connection存入集合对象中)。

注:Connection对象应保证将自己返回到连接池的集合对象中,而不要把Connection还给数据库。

实际编程时我们并不需要自己编写连接数据库代码,有一些开源组织提供了数据库连接池的实现,我们只要会使用即可。在我实习的公司,主要使用以下两种开源数据库连接池:

  • C3P0 数据库连接池
  • DBCP 数据库连接池

为此,就这两种数据库连接池,我做一简单的介绍。

C3P0 数据库连接池

C3P0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有Hibernate,Spring 等。

C3P0 所需 JAR 包: c3p0-0.9.2.1.jar 和 mchange-commons-java-0.2.3.4.jar

配置文件常用的属性:

####### c3p0 #######
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/test
c3p0.user=xxxx
c3p0.password=xxxxx

c3p0.initialPoolSize=10 //初始化连接数
c3p0.minPoolSize=10 //最大连接数
c3p0.maxPoolSize=30 //最小连接数
c3p0.maxIdleTime=30 //最大空闲时间 => 这就是为什么C3P0有自动回收的原因
c3p0.acquireIncrement=5 //新增连接数

当创建连接池时,一次性创建initialPoolSize 个连接,当连接使用完一次性创建 acquireIncrement 个连接,连接最大数量 maxPoolSize ,当连接池连接数量大于 minPoolSize ,经过 maxIdleTime 连接没有使用, 该连接将被释放。

C3P0 连接创建方式主要分为:配置文件形式和硬编码形式,这点和 DBCP 数据库连接池非常相似,唯一不同的就是配置文件命名规范不同,C3P0 配置文件必须命名为 c3p0-config.xml 或 c3p0-config.properties ,并且放在 src 目录下,而 DBCP 没有这样的要求。

DBCP 数据库连接池

DBCP(DataBase connection pool), 数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 默认使用的连接池组件。

DBCP 需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar

配置文件常用的属性:

####### dbcp #######
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=xxxx
password=xxxxx

initialSize=10
# maxActive=10  // dbcp2中已将MaxActive设置为MaxTotal
maxTotal=30  // 可以在这个池中同时被分配的有效连接数的最大值,如设置为负数,则不限制
maxIdle=10  // 可以在池中保持空闲的最大连接数,超出设置值之外的空闲连接将被回收,如设置为负数,则不限制
minIdle=5   // 可以在池中保持空闲的最小连接数,超出设置值之外的空闲连接将被创建,如设置为0,则不创建

关于 C3P0 和 DBCP 配置文件更详细的说明,请自行了解。Demo 可参见我的GitHub仓库,后续会补充测试代码。

C3P0 与 DBCP 区别

  1. C3P0 自动回收空闲连接
  • 主要因为 maxIdleTime 属性,当连接池连接数量大于 minPoolSize ,经过 maxIdleTime 连接没有使用, 该连接将被释放
  1. C3P0 拥有 3 种配置方法,DBCP 拥有 2 种配置方法
  2. 对数据连接的处理方式,C3P0 提供最大空闲时间,DBCP 提供最大连接数
  • 前者当连接超过最大空闲连接时间时,当前连接就会被断掉。DBCP 当连接数超过最大连接数时,所有连接都会被断开。

参考链接

  1. 数据库连接池的工作原理
  2. JDBC 进阶——连接池

相关文章

  • 数据库连接池

    使用数据库连接池优化程序性能 编写数据库连接池 编写连接池需事先java.sql.DataSource接口。Dat...

  • 连接池 —— DBCP技术 和 C3P0 技术

    一 DBCP 概述 DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接...

  • Spring Boot使用Druid连接池

    Druid是Java语言中最好的数据库连接池。Druid相比于其他的数据库连接池,有两大特性: 监控数据库,有利于...

  • 使用数据库连接池连接数据库

      java中连接到数据库可以通过JDBC连接,也可以通过数据库连接池连接数据库,连接池主要在在程序启动的时候建立...

  • 数据库连接池&DBUtils

    来自拉钩教育-JAVA就业集训营 1.数据库连接池 1.1 连接池介绍 什么是连接池 实际开发中“获得连接”或“释...

  • Grails 3.2.3 如何把连接池换成Druid

    阿里开源的Java数据库连接池Druid(https://github.com/alibaba/druid/)...

  • Spring Boot集成Druid数据库连接池

    1. 前言 Druid数据库连接池由阿里巴巴开源,号称是java语言中最好的数据库连接池,是为监控而生的。Drui...

  • Springboot+Druid

    简介: Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功...

  • SpringBoot 整合Druid

    前言 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能...

  • JDBC连接池

    Java 为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自 己的连接池实...

网友评论

      本文标题:Java 数据库连接池笔记

      本文链接:https://www.haomeiwen.com/subject/guyfaxtx.html