数据库链接池示实例

数据库连接池

为什么使用连接池

使用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连接池-国产,阿里巴巴,开源
相关推荐
Mr数据杨3 分钟前
练习题 - Django 4.x Overviewses 框架概述
数据库·sqlite
就这个java爽!14 分钟前
超详细的XML介绍【附带dom4j操作XML】
xml·java·开发语言·数据库·青少年编程·eclipse
_.Switch19 分钟前
Python Web 架构设计与性能优化
开发语言·前端·数据库·后端·python·架构·log4j
Shall#23 分钟前
Innodb存储架构
数据库·mysql·架构
SelectDB技术团队1 小时前
Apache Doris 2.1.6 版本正式发布
大数据·数据库·数据仓库·开源·doris
不会八股文1 小时前
达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?
xml·数据库
拜见老天師1 小时前
SpringBoot中对数据库连接配置信息进行加密处理
数据库·spring boot·后端
萌新小码农‍1 小时前
汽车美容服务管理系统的数据库设计与数据操作
数据库·汽车
x66ccff1 小时前
【linux】快速列出 systemctl 特定名的服务
linux·服务器·数据库
Jiangw5571 小时前
【实战篇】MySQL是怎么保证主备一致的?
数据库·sql·mysql