数据库链接池示实例

数据库连接池

为什么使用连接池

使用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连接池-国产,阿里巴巴,开源
相关推荐
冉冰学姐5 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly12 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客20 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.24 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐29 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999931 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
全栈前端老曹2 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8632 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann