MySQL 数据库连接

数据连接:

连接:

MySQL 驱动:mysql-connector-Java-XXX.jar

数据库连接的建立及关闭是及耗费系统资源的操作,在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。
通过 DriverManager 获得数据库连接的方式,一个数据库连接对象对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。

数据库连接池的解决方案是,当应用程序启动时候,系统建立足够多的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池,通过使用连接池将大大提高程序的运行效率。

对于资源共享的情况,有一个通用的设计模式:资源池(Resource Pool),用于解决资源频繁请求释放资源的压力。 JDBC 2.0 规范引入了数据库连接池技术。JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource只是一个接口,该接口通常由商用服务器(WebLogic,WebSphere)等提供实现,也有一些开源组织提供实现(如 JDBC 和 C3P0 等)。DataSource通常被称为数据源,它包含了连接池和连接池管理两个部分,但习惯上已经常把DataSource称为连接池。

两种连接模式:

传统统链接:

  1. 装载数据库驱动程序
  2. 通过 JDBC 建立数据库连接
  3. 访问数据库 执行 SQL 语句 (TCP)
    1. 建立连接 连接:三次握手
    2. MySQL 认证 认证:三次握手
    3. MySQL 执行 执行 SQL 返回结果
  4. 断开数据库连接 关闭:四次挥手
image-20210724004735640

连接池链接:

  1. 程序初始化时创建连接池
  2. 使用时向连接池申请可用连接
  3. 使用完毕,将连接返还给连接池
  4. 程序退出时,断开所有连接,并释放资源
image-20210724004909297

连接池:

目的:

使用连接池是为了减少创建数据库连接的开销

数据库连接池负责分配 管理和释放数据库连接 它允许应用程序重复使用一个现有的数据库连接 而不是重新建立一个

基础:

连接池在初始化的时候会创建一定数量的数据库连接放到连接池中
数据库连接的数量 由最小数据库连接数 决定
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数 超过连接数的请求会加入等待队列
新创建的数据库连接 不会消失 而是放到了连接池中 等待复用或者空闲时间超时后被释放

常见连接池:
  • c3p0 是一个开放源代码的 JDBC 连接池,它在 lib 目录中与 Hibernate 一起发布, 包括实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate,Spring 等。

    • hibernate 开发组推荐使用 c3p0;
    • c3p0 所需 jar:c3p0-0.9.2.1.jar mchange-commons-java-0.2.3.4.jar
  • DBCP 是 apache 上的一个 java 连接池项目, 是一个依赖 Jakarta commons-pool 对象池

    机制的数据库连接池.DBCP 可以直接的在应用程序中使用,Tomcat 的数据源使用的就是 DBCP

    • dbcp 所需 jar:commons-dbcp.jarcommons-pool.jar
  • Druid 是阿里巴巴出品的数据源 而且是淘宝和支付宝专用数据库连接池 但它不仅仅是一个数据库连接池 它还包含一个ProxyDriver 一系列内置的JDBC组件库 一个 SQL Parser

    1. Druid 是阿里开源的连接池 可以说是 Java 语言中最好的数据库连接池 Druid 能够提供强大的日志监控扩展功能,是为监控而生的数据库连接池!【主要是监控DB池连接和SQL的执行情况
    2. Druid 支持所有 JDBC 兼容的数据库,包括 Oracle、MySql、Derby、Postgresql、SQL Server、H2 等等。
    3. Druid 针对 Oracle 和 MySql 做了特别优化,比如 Oracle 的 PS Cache 内存占用优化,MySql 的 ping 检测优化。Druid 提供了 MySql、Oracle、Postgresql、SQL-92 的 SQL 的完整支持,这是一个手写的高性能 SQL Parser,支持 Visitor 模式,使得分析 SQL 的抽象语法树很方便
    4. 简单 SQL 语句执行耗时 10 微秒以内,复杂 SQL 耗时 30 微秒
    5. 通过 Druid 提供的 SQL Parser 可以在 JDBC 层拦截 SQL 做相应处理,比如说分库分表、审计等。
    6. Druid 防御 SQL 注入攻击的 WallFilter 就是通过 Druid 的 SQL Parser 分析语义实现的。