自定义数据库连接池

news2024/12/23 3:48:15
为什么要用数据库连接池?

mysql连接资源非常宝贵,创建连接和关闭连接花费的时间比较长,使用数据库连接池可以提高我们开发效率,用户从连接池获取连接使用用完了后,需要把连接归还给连接池,所以我们需要用LinkedList链表存储连接

编写数据库连接池
public class MyDataSource implements DataSource {

    //准备连接池集合
    private  LinkedList<Connection> conns=new LinkedList<>();


    public MyDataSource(){

        //初始化连接池  提前创建好连接,放入集合中

        try {

            //1.读取properties配置文件

            //1.1创建properties集合
            Properties properties=new Properties();

            //1.2创建字节输入流,读取properties文件的内容
            FileInputStream in = new FileInputStream("E:\\code\\code\\src\\datasource.properties");

            //1.3把InputStream中的内容保存到Properties集合中
            properties.load(in);

            //2.注册驱动
            Class.forName(properties.getProperty("jdbc.driverClassName"));


            //3.获取连接
            for(int i=0;i<Integer.valueOf(properties.getProperty("jdbc.init"));i++){

                //获取连接
                Connection conn = DriverManager.getConnection(properties.getProperty("jdbc.url"),
                        properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password"));

                //把连接放入集合
                conns.add(conn);

            }

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("创建数据库连接池失败!");
        }


    }


    /**
     * 获取链接
     * @return
     * @throws SQLException
     */
    @Override
    public Connection getConnection() throws SQLException {

        //移除并且返回一个连接
        Connection connection = conns.removeFirst();

        return connection;
    }


    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }
}

因为我们使用完连接后,不是关闭连接而是把链接还给linklist集合,所以我们需要重写close方法,这里用到了包装设计模式,也可以用代理设计模式

包装设计模式:
//1.编写一个类,实现Connection接口 考虑的数据库太多了
//2.继承ConnectionImpl,重写close方法
//3.装饰设计模式(包装设计模式)
// 3.1 编写一个类,实现与被增强对象相同的接口
// 3.2 定义一个变量,记住被增强对象
// 3.3 定义一个构造方法接收被增强对象
// 3.4 覆盖想覆盖的方法
// 3.5 对于不想覆盖的方法直接调用被增强对象的方法来实现

public class MyDataSource implements DataSource {

    //准备连接池集合
    private  LinkedList<Connection> conns=new LinkedList<>();


    public MyDataSource(){

        //初始化连接池  提前创建好连接,放入集合中

        try {

            //1.读取properties配置文件

            //1.1创建properties集合
            Properties properties=new Properties();

            //1.2创建字节输入流,读取properties文件的内容
            FileInputStream in = new FileInputStream("E:\\code\\code\\src\\datasource.properties");

            //1.3把InputStream中的内容保存到Properties集合中
            properties.load(in);

            //2.注册驱动
            Class.forName(properties.getProperty("jdbc.driverClassName"));


            //3.获取连接
            for(int i=0;i<Integer.valueOf(properties.getProperty("jdbc.init"));i++){

                //获取连接
                Connection conn = DriverManager.getConnection(properties.getProperty("jdbc.url"),
                        properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password"));

                //把连接放入集合
                conns.add(conn);

            }

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("创建数据库连接池失败!");
        }


    }


    /**
     * 获取链接
     * @return
     * @throws SQLException
     */
    @Override
    public Connection getConnection() throws SQLException {

        //1.获取被增强对象 真正的连接
        Connection connection = conns.removeFirst();

        //2.包装设计模式(装饰)
        return new MyConnection(connection);
    }


    //1.编写一个类,实现Connection接口  考虑的数据库太多了
    //2.继承ConnectionImpl,重写close方法
    //3.装饰设计模式(包装设计模式)
    // 3.1 编写一个类,实现与被增强对象相同的接口
    // 3.2 定义一个变量,记住被增强对象
    // 3.3 定义一个构造方法接收被增强对象
    // 3.4 覆盖想覆盖的方法
    // 3.5 对于不想覆盖的方法直接调用被增强对象的方法来实现
    // 动态代理

    //1.编写一个类,实现与被增强对象相同的接口
    class MyConnection implements Connection{

        //2.定义一个变量,记住被增强对象
        private Connection conn;

        //3.定义一个构造方法接收被增强对象
        public MyConnection(Connection conn){
            this.conn=conn;
        }

        //4.覆盖想覆盖的方法
        @Override
        public void close() throws SQLException {
             //还连接
            conns.add(conn);
        }

        //5.对于不想覆盖的方法直接调用被增强对象的方法来实现
//不想覆盖的方法此次省略。。。 
使用第三方数据库连接池

在这里插入图片描述
在这里插入图片描述

public class TestDataSource {

    public static void main(String[] args) throws Exception {

        //1.创建连接池
        ComboPooledDataSource dataSource=new ComboPooledDataSource();

        //2.通过set方法设置相关连接信息
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/jdbc");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setMinPoolSize(5);
        dataSource.setMaxPoolSize(9);;


        //3.获取连接
        Connection connection = dataSource.getConnection();

        System.out.println(connection);

    }

}
druid

在这里插入图片描述

public class TestDataSource {

    public static void main(String[] args) throws Exception {

        //1.创建连接池
        DruidDataSource dataSource=new DruidDataSource();


        //2.通过set方法设置相关连接信息
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/jdbc");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        dataSource.setMinIdle(5);
        dataSource.setMaxActive(9);


        //3.获取连接
        Connection connection = dataSource.getConnection();

        System.out.println(connection);

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rasa.3X中使用lookup实现对实体的抽取

rasa3.6的DIETClassifier实体提取器不准确&#xff0c;使用RegexEntityExtractor的实体提取器替换。在实战过程解决以下两个问题&#xff1a; 1、RegexEntityExtractor实体提取器的应用 首先在domain.yml中明确对应的实体以及意图&#xff1a; version: "3.0" ent…

【知识拓展】机器学习基础(二):什么是模型、自定义模型、模型训练、模型调优

前言 接上文&#xff0c;前文对模型没有过多介绍&#xff0c;随着看的资料增多&#xff0c;对模型有了更多的自我认识&#xff0c;记录一下。要了解模型&#xff0c;我们先从零开始创建一个模型开始&#xff1a; 最简单的方法是使用Python和scikit-learn库。关于scikit-learn库…

iframe内嵌网页自适应缩放 以展示源网页的比例尺寸

需求:这是我最近开发的低代码平台遇到的需求 ,要求将配置好的应用在弹框中预览(将预览网页内嵌入弹框中) 但是内嵌进入后 他会截取一部分(我源网站网页尺寸 是1980x1080 或者 3060X2160等等) 但是我这个dialog弹框只有我自定义的1000多px的宽高 他只会展示我iframe网页的一部分…

Docker安装Zookeeper(单机)

Docker安装Zookeeper&#xff08;单机&#xff09; 目录 Docker安装Zookeeper&#xff08;单机&#xff09;拉取镜像创建目录添加配置文件启动容器测试 拉取镜像 docker pull zookeeper创建目录 mkdir -p /data/zookeeper/data # 数据挂载目录 mkdir -p /data/zookeeper/conf…

身份认证与口令攻击

身份认证与口令攻击 身份认证身份认证的五种方式口令认证静态口令动态口令(一次性口令)动态口令分类 密码学认证一次性口令认证S/KEY协议改进的S/KEY协议 其于共享密钥的认证 口令行为规律和口令猜测口令规律口令猜测 口令破解操作系统口令破解Windows密码存储机制Windows密码破…

一步将 CentOS 7.x 原地迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 在《在离线环境中将 CentOS 7.X 原地迁移至 RHEL 7.9》一文中为了实现从 CentOS 7.X 原地迁移至 RHEL 7.9&#xff0c;我们第一步先将一个测试环境 CentOS 7.5 升级到 CentOS 7.9&#xff0c;然后在第二步使用 convert2rhel &…

太阳能语音警示杆在户外的应用及其作用

一、太阳能语音警示杆的主要应用领域 交通管理&#xff1a;在城市道路、乡村公路、高速公路等交通要道&#xff0c;太阳能语音警示杆可以用于提醒驾驶员注意前方路况、减速慢行或者避让施工区域。例如&#xff0c;在临时施工路段&#xff0c;警示杆可以播放“前方施工&#xf…

HTML语义化标签

<header> 主要用于网页整体顶部&#xff0c;<article>头部&#xff0c;<section>头部 <nav> 导航&#xff0c;一般有主要导航&#xff0c;路径导航&#xff0c;章节导航&#xff0c;内容目录导航 <main> 网页主要区域&#xff0c;一般一个网页…

Mysql基础教程(11):DISTINCT

MySQL DISTINCT 用法和实例 当使用 SELECT 查询数据时&#xff0c;我们可能会得到一些重复的行。比如学生表中有很多重复的年龄。如果想得到一个唯一的、没有重复记录的结果集&#xff0c;就需要用到 DISTINCT 关键字。 MySQL DISTINCT用法 在 SELECT 语句中使用 DISTINCT 关…

STM32高级控制定时器之输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…

部署专属网页版ChatGPT-Next-Web

背景 工作学习中经常使用chat-gpt, 需求是多端使用gpt问答&#xff0c;因此搭建一个网页版本方便多个平台使用。最后选择了 ChatGPT-Next-Web 部署说明 一键部署自己的web页面&#xff0c;因为是使用免费的vercel托管的&#xff0c;vercel节点在全球都有&#xff0c;理论上突…

OAK相机如何将 YOLOv10 模型转换成 blob 格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ashely。 专…

NVIDIA Blackwell Architecture

本文翻译自&#xff1a;NVIDIA Blackwell Architecture https://www.nvidia.com/en-us/data-center/technologies/blackwell-architecture/ 文章目录 了解技术突破1、新型人工智能超级芯片2、第二代 Transformer 引擎3、Secure AI4、NVLink 和 NVLink 交换机5、解压缩引擎6、可…

景源畅信数字:抖音新手如何找好自己的发布领域?

在短视频的浪潮中&#xff0c;抖音以其独特的魅力吸引了众多用户。对于刚踏入这个平台的新手来说&#xff0c;找到适合自己的发布领域至关重要。那么&#xff0c;如何在这个充满竞争的平台上找到自己的定位呢?接下来&#xff0c;就让我们一起来探讨这个问题。 一、明确兴趣爱好…

Java18+ springboot+mysql +Thymeleaf 技术架构开发的全套同城服务家政上门系统源码(APP用户端+APP服务端+PC管理端)

Java springbootmysql Thymeleaf 技术架构开发的全套同城服务家政上门系统源码&#xff08;APP用户端APP服务端PC管理端&#xff09; 家政上门预约系统&#xff1a;该系统综合运用springboot、java1.8、vue移动支付、微信授权登录等技术&#xff0c;由用户小程序、站长小程序、…

AI网络爬虫:无限下拉滚动页面的另类爬取方法

现在很多网页都是无限下拉滚动的。可以拉动到底部&#xff0c;然后保存网页为mhtml格式文件。 接着&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程高手&#xff0c;要完成一个关于爬取网页内容的Python脚本的任务&#xff0c;下面是具体步骤&#xff1a; …

利用依赖结构矩阵管理架构债务

本文讨论了如何利用依赖结构矩阵&#xff08;DSM&#xff0c;Dependency Structure Matrix&#xff09;管理和识别架构债务&#xff0c;并通过示例应用展示了这一过程。原文: Managing Architecture Debt with Dependency Structure Matrix Vlado Paunovic Unsplash 技术债务&a…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节&#xff1a; 1、SD卡分区 提示&#xff1a;我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况&#xff0c;NXP官方给的镜像布局结构如下所示&#xff1a; 可以看到&#xff0c…

simulink基础学习笔记

写在前面 这个笔记是看B站UP 快乐的宇航boy 所出的simulink基础教程系列视频过程中记下来的&#xff0c;写的很粗糙不完整&#xff0c;也不会补。视频教程很细跟着做就行。 lesson1-7节的笔记up有&#xff0c;可以加up的群&#xff0c;里面大佬挺活跃的。 lesson8 for循环 For …