Python工程师Java之路(w)数据库连接池Druid

news2024/11/24 8:04:22

概述

  • 初阶数据库访问的步骤是【创建连接=>执行SQL=>关闭连接】,有如下不足:
    1、创建数据库连接会浪费时间
    2、大量访问时,频繁 GC 会导致CPU负载过高
    3、如果改为不关闭连接,则会长期占用内存
  • 对此,引入“缓冲池”思想:
    在“缓冲池”中预备一定数量的数据库连接
    当需要访问数据库时,就从“缓冲池”中取出一个,用完后放回
    当大量访问时,“缓冲池”中的数据库连接不够,就新建数据库连接
    当访问量变少,就关闭部分数据库连接,减少到初始(下限)数量
  • 数据库连接池(connection pool)
    负责分配、管理和释放数据库连接
    允许应用程序重复使用一个现有的数据库连接,而不是新建一个
  • 数据库连接的数量下限:
    连接池将保证一定数量的连接,即使它们没被使用
  • 数据库连接的数量上限:
    请 求 数 > 最 大 连 接 数 请求数>最大连接数 > 时,后面请求将被加入 等待队列
  • 数据库连接池优点:
    1、提高反应速度
    2、充分而均衡地利用CPU和内存,降低 CPU高负载 或 内存泄漏 的风险

数据库连接池

获取空闲的数据库连接

DRUID

DRUID是阿里巴巴开源平台上一个数据库连接池实现,代码如下

pom.xml

<!-- MySQL的JDBC -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.31</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.15</version>
</dependency>

入门代码

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class Hello {
    public static void main(String[] args) throws SQLException {
        //TODO 1 创建数据库连接池
        DruidDataSource d = new DruidDataSource();

        //TODO 2 设置MySQL基本连接参数
        d.setDriverClassName("com.mysql.cj.jdbc.Driver"); //驱动全类名
        d.setUrl("jdbc:mysql://localhost:3306"); //JDBC的URL
        d.setUsername("root"); //数据库用户名
        d.setPassword("123456"); //数据库密码

        //TODO 3 设置缓冲池参数
        d.setInitialSize(1); //初始化时的连接数
        d.setMaxActive(2); //同时活跃的最大连接数
        d.setMinIdle(1); //空闲时的最小连接数
        d.setMaxWait(3000L); //用户等待最大毫秒数

        //TODO 4 访问数据库
        DruidPooledConnection c = d.getConnection();
        //用于执行静态SQL并返回结果的对象
        Statement s = c.createStatement();
        //执行SQL(默认情况下,每个Statement对象只能同时打开一个ResultSet对象)
        ResultSet r = s.executeQuery("SELECT 8 AS a,'x' AS b UNION ALL SELECT 9 AS a,'y' AS b");
        //获取元数据
        ResultSetMetaData m = r.getMetaData();
        System.out.println(m.getColumnName(1) + "\t" + m.getColumnName(2));
        //获取数据
        while (r.next()) {
            System.out.println(r.getInt(1) + "\t" + r.getString(2));
        }
        //释放ResultSet,释放Statement,归还数据库连接
        r.close();
        s.close();
        c.close();

        //TODO 5 连接数测试
        (new MyThread()).start();
        for (int i = 0; i < 3; i++) {
            d.getConnection();
        } //上面设置了最大连接数2,第3个连接超时3秒后报错
    }

    static class MyThread extends Thread {
        @Override
        public void run() {
            for (int i = 1; i < 5; i++) {
                try {
                    Thread.sleep(999L);
                    System.out.println("过了" + i + "秒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

代码运行结果打印

封装数据库连接池工具类

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseConnectionPool {
    private final DruidDataSource druidDataSource;

    public DatabaseConnectionPool() {
        druidDataSource = new DruidDataSource();
        //始化时的连接数量
        druidDataSource.setInitialSize(5);
        //同时活跃的最大连接数
        druidDataSource.setMaxActive(20);
        //空闲时的最小连接数
        druidDataSource.setMinIdle(1);
        //获取连接等待的最大毫秒数,超时抛出异常,设-1表示一直等待
        druidDataSource.setMaxWait(-1L);
        //借出连接时 是否测试,false不测试 提升性能
        druidDataSource.setTestOnBorrow(false);
        //归还连接时 是否测试
        druidDataSource.setTestOnReturn(false);
        //每隔30秒运行一次 空闲连接回收器
        druidDataSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);
        //池中 空闲30分钟的连接将被回收
        druidDataSource.setMinEvictableIdleTimeMillis(30 * 60 * 1000L);
    }

    public void setDBCP(String driverClass, String jdbcUrl) {
        druidDataSource.setDriverClassName(driverClass);
        druidDataSource.setUrl(jdbcUrl);
    }

    public void setDBCP(String driverClass, String jdbcUrl, String user, String pwd) {
        setDBCP(driverClass, jdbcUrl);
        druidDataSource.setUsername(user);
        druidDataSource.setPassword(pwd);
    }

    public void selectPrint(String sql) throws SQLException {
        DruidPooledConnection c = druidDataSource.getConnection();
        //获取 用于执行静态SQL并返回结果的对象
        Statement s = c.createStatement();
        //执行SQL(默认情况下,每个Statement对象只能同时打开一个ResultSet对象)
        ResultSet r = s.executeQuery(sql);
        //获取元数据
        ResultSetMetaData m = r.getMetaData();
        //获取列数
        int columnCount = m.getColumnCount();
        //打印列名
        System.out.print("行号");
        for (int i = 1; i <= columnCount; i++) {
            System.out.print("\t|\t" + m.getColumnName(i));
        }
        System.out.println();
        //打印数据
        while (r.next()) {
            System.out.print(r.getRow());
            for (int i = 1; i <= columnCount; i++) {
                System.out.print("\t|\t" + r.getObject(i));
            }
            System.out.println();
        }
        //释放ResultSet,释放Statement,归还数据库连接
        r.close();
        s.close();
        c.close();
    }

    public static void main(String[] args) throws SQLException {
        //测试
        DatabaseConnectionPool d = new DatabaseConnectionPool();
        d.setDBCP("com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306", "root", "123456");
        d.selectPrint("SELECT 8 AS a,'x' AS b UNION ALL SELECT 9 AS a,'y' AS b");
    }
}

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

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

相关文章

物联网各类数据如何轻松获取?秘诀就在定制文件推送服务

当前&#xff0c;数字经济已成为我国经济发展的重要驱动力。随着物联网的蓬勃发展&#xff0c;海量数据伴随着终端联网在各行各业涌现&#xff0c;越来越多的企业已然察觉隐藏在数字中的金矿&#xff0c;加入到数字化转型行列中&#xff0c;通过数据挖掘实现精细化运营&#xf…

高蛋白过敏我们该如何缓解?教你几招远离过敏吃喝无忌

许多朋友回应说&#xff0c;吃海鲜.牛肉、羊肉等高蛋白食物会发生过敏反应&#xff0c;要么脸红肿&#xff0c;要么长痘痘。看着他们贪婪的食物&#xff0c;他们只能避免吃真的很痛苦。为什么现在人们的生活条件越来越好&#xff0c;生活环境也显著改善&#xff0c;但过敏性疾病…

USB插座外壳接地的处理和emi,esd考虑

外壳是否接地&#xff0c;从理想电路环境&#xff08;没有干扰&#xff0c;也不释放干扰&#xff09;和电路原理来说&#xff0c;接和不接没有任何差异&#xff0c;也不会影响正常功能。 但是实际的电子产品的工作环境&#xff0c;是一个处于被各种干扰包围的复杂的电磁场环境&…

[附源码]JAVA毕业设计人才库构建研究(系统+LW)

[附源码]JAVA毕业设计人才库构建研究&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

使用icacls命令设置目录及其子目录、文件的所有权限

以前一直使用cacls命令来设置权限&#xff0c;前两天输入这个命令的时候&#xff0c;却发现了一行提示&#xff1a; “注意: 不推荐使用 Cacls&#xff0c;请使用 Icacls。” 如图&#xff1a; 于是研究了一下 Icacls 这个命令。。 先放上微软官方文档&#xff1a; https:/…

单场直播销售额破7亿,11月的抖音带货风向是什么?

双11走过14年&#xff0c;今年的双11有些特别。我们发现&#xff0c;各个平台在交易额战报的发布上都变得更加保守&#xff0c;而无论是天猫还是京东&#xff0c;均首次未公布具体的交易额。在消费市场出现波动的当下&#xff0c;双11正在经历转变&#xff0c;从重视成交额&…

基于遗传算法的二进制图像重建(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f4a5;1 概述 图像分辨率是评价图像成像系统的---项重要技术指标.图像分辨率又分为图像的空间分辨率、灰度分辨率和频谱分辨率等.在实际应用中,受到各种因素的限制,通过现有条件要达到所需…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK9特性讲解】

JDK各个版本特性讲解-JDK9特性 lecture&#xff1a;波哥 一、JDK版本特性 JAVA8 及之前,版本都是特性驱动的版本更新,就是有重大的特性产生,然后进行更新 JAVA9开始,JDK开始以时间为驱动进行更新,以半年为周期,到时即更新,三年出一个长期支持版,其他都是短暂的版本 目前的长期支…

非常好用的C# .Net开源高性能跨平台内网穿透工具FastTunnel 香橙派orangepi

特别适合在家里做个web或者文件服务器之类&#xff0c;还可以用在树莓派&#xff0c;香橙派搭建个服务器&#xff0c;很好用 FastTunnel是什么&#xff1f; FastTunnel是一款高性能跨平台内网穿透工具&#xff0c;使用它可以实现将内网服务暴露到公网供自己或任何人访问。与其…

【linux】进程的概念与控制

目录 冯诺依曼体系结构 操作系统(Operator System) 进程 基本概念 组织进程 查看进程 进程状态 僵尸进程危害 环境变量 程序地址空间 挂起 进程创建 写时拷贝 进程终止 _exit函数 exit函数 参数&#xff1a; 冯诺依曼体系结构 我们常见的计算机&#xff0c;如…

分享10大自动化测试框架,你用过几个?

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐&#xff0c;必须加快应用程序的交付时间&#xff0c;但不能以牺牲质量为代价。快速实现质量是必要的&#xff0c;因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…

Java基于JSP实验室预约管理系统

科技水平一直是体现一个国家强弱的重要标志&#xff0c;而科技的一点诞生地是实验室&#xff0c;如果能够更好的对实验室进行管理是很多实验室管理人员一直研究的一个问题。只有更加科学和合理化的利用实验室才能够更好的让科技水平有所提高和发展&#xff61; 本项目利用软件工…

毕设项目 - SSM考研信息查询管理系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 系统开发流程3.2.2 操作流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品…

MAX3072EESA+T RS-485/RS-422半双工收发器

MAX3072EESAT 3.3V15kV具有ESD保护、失效保护、热插拔、RS-485/RS-422收发器具备一个驱动器和一个接收器。包含失效保护电路&#xff0c;当接收器输入开路或短路时保证接收器输出逻辑高。当端接总线上的所有发送器被禁止(高阻抗)时&#xff0c;接收器输出逻辑高。MAX3072EESAT具…

springboot基于Java的电影院售票与管理系统毕业设计源码011449

电影院售票与管理系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对电影院售…

自动驾驶:2022 apollo day 观后感(二)

自动驾驶&#xff1a;2022 apollo day 观后感&#xff08;二&#xff09;TOPIC TWO&#xff1a;自动驾驶地图&#xff1a;Apollo的实践和思考&#xff08;黄际洲&#xff09;地图需求升级自动驾驶规划方向轻成本&#xff0c;重体验轻成本重体验安全&#xff1a;舒适度出行效率新…

终于有人把Java面试高分Guide总结得如此系统,堪称傻瓜式笔记总结

纵观今年的技术招聘市场&#xff0c; Java依旧是当仁不让的霸主 &#xff01;即便遭受 Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b;Java在 运维、可观测性、可监 控性方面都有着非常优…

LeetCode简单题之温度转换

题目 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数组 ans [kelv…

基于web在线餐饮网站的设计与实现——仿Coco线上订奶茶饮料6个页面(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

用友NC6.5 Linux服务器环境部署

用友NC6.5 Linux服务器环境部署 1.环境配置要求  1.1 操作系统平台 应用服务器操作系统版本&#xff08;补丁&#xff09;中间件类型JDK 版本Linux-RedHat(x64&#xff0c;多核)Enterprise Linux Server release 6.3Websphere 8.5.0.1/UAP/Weblogic11SUN JDK1.7_51/IBM SDK,V…