数据库链接池示实例

数据库连接池

为什么使用连接池

使用JDBC和数据库建立连接的方式

  • 建立连接
  • 执行对数据库的操作
  • 关闭连接
  • 回收资源

每次要访问数据库都要 先建立连接 执行操作 然后再 断开连接 回收资源 如果经常对数据库操作 则内存开销大

使用一次 连接一次

使用连接池和数据库建立连接

  • 创建连接池(只需要执行一次)
  • 从连接池获取连接
  • 执行对数据库的操作
  • 将连接放回连接池

Q:放回连接池后的连接还能被再次利用吗

A:可以,只要保证连接池中有空闲的连接就能和数据库建立连接

每次要对数据库进行操作时就从连接池中取出一个连接 操作完成之后放回 方便快捷

**按需要获取连接 从连接池中获取一个连接 用完再放回 **

使用连接池的好处

  • 提高资源的重用性(主要原理)

避免频繁的创建数据库连接,先创建多个联机放入连接池可以重复使用

  • 响应速度更快

不需要再从头建连接,直接从连接池中获取连接,减少了时间开销

  • 新的资源分配

可以直接在应用层管理连接池中的资源,使用JDBC的话则不能管理

  • 统一的资源管理

可以统一的对连接池中的链接进行管理,能设置连接个数还能设置超时断开时间

使用连接池本质上的多个数据库建立连接的重用,重用性得到提高其连接的响应速度会更快,连接的效率更高,也更加方便管理

连接池原理

建立连接池

  • 建立若干和数据库的连接
  • 将建立的联机放入容器中

对连接池的管理(核心)

  • 和线程相配合
  • 可以设置最大等待时间 到时间强制关闭连接 抛出异常
  • 建立连接先需要先判断是否达到了设定的最大值

Q:建立的连接数量能超过所设定的最大值吗?

A:可以超过,有上限并不说明一定不能超过这个数量

比如上限是5个连接当连接需求增多时可以增加到6个(超过了最大连接限制)

Q:为什么可以超过,能超过最多是多少

A:当需要更多的连接时如果不能及时的提供则会造成访问时间长,可以超过但不能无限度的超过比如不能超过上线的30%

连接池的关闭

  • 关闭连接池的时间是 整个程序退出时

连接池的配置

  • 主要的配置是minConn和maxConn用来限制连接池的数量
    • minxConn 是启动时要建立的连接数量
    • maxConn是 最大的建立的连接数量

Q:minConn应该设置多少?设置的过多或过少会怎样

A:设置的多-启动时慢-响应快

设置的少-启动快-但可能因为连接不足造成执行速度缓慢 需要自行寻找饱 和点 权衡驱动时间和响应

自定义数据库连接池

java 复制代码
package come.example.jdbc.chapter02;

import java.sql.Connection;

/**
 * @Classname TestMyConnectionPool
 * @Description 测试自定义连接池
 * @Author Jay lan
 * @Date 2023/9/12 20:21
 * @Version 1.0.0
 */
public class TestMyConnectionPool {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            try {
//                从连接池获取连接
                Connection connection=MyConnectionPool.getConnection();
//                使用获取到的链接
                System.out.println("获取到的第"+i+"个连接为:"+connection);
//                将连接放回连接池
                MyConnectionPool.releaseConnection(connection);


            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
java 复制代码
package come.example.jdbc.chapter02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;


/**
 * @Classname MyConnectionPool
 * @Description 自定义的数据库连接池
 * @Author Jay lan
 * @Date 2023/9/11 11:39
 * @Version 1.0.0
 */


public class MyConnectionPool {
    //    创建一个存储Connection兑现的List作为连接池
    private static final LinkedList<Connection> myPool = new LinkedList<Connection>();

    //    建立三个连接并放入连接池
    static {
        try {
            for (int i = 0; i < 3; i++) {
//                注册驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
//                获取JDBC连接
                Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/chapter01","root","Xi233");
//                将连接放入连接池(存放Connection的List)
                myPool.add(connection);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @return Connection对象(连接)
     * @Description 从连接池中获取一个连接
     */
    public static Connection getConnection() {
//        removeFirst()从集合中移除第一个元素并将其返回
//        getFirst()则是取出第一个元素不将其从集合中移除
        return myPool.removeFirst();
    }

    /**
     * @param connection 要释放的连接
     * @Description 释放一个连接将放回连接池
     */
    public static void releaseConnection(Connection connection) {
        if (connection != null) {
            myPool.add(connection);
        }

    }

}

常用的连接池

  • CP30-开源
  • DBCP连接池-Apache组织,开源,适合服务器,独立的应用程序
  • Druid连接池-国产,阿里巴巴,开源
相关推荐
难以触及的高度几秒前
mysql中between and怎么用
数据库·mysql
Jacky(易小天)14 分钟前
MongoDB比较查询操作符中英对照表及实例详解
数据库·mongodb·typescript·比较操作符
Karoku0661 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer2 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体2 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪3 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿3 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员