MySQL 数据库连接

发布时间 2023-07-25 18:40:20作者: 熏晴微穗

数据连接:

连接:

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分析语义实现的。