druid(德鲁伊)数据线程池连接MySQL数据库

news2024/9/21 18:42:39

文章目录

  • 1、druid连接MySQL
  • 2、编写JDBCUtils 工具类

1、druid连接MySQL

初学JDBC时,连接数据库是先建立连接,用完直接关闭。这就需要不断的创建和销毁连接,会消耗系统的资源。

借鉴线程池的思想,数据连接池就这么被设计出来了。

什么是连接池?
连接池是在程序初始化的时候,预先创建好指定数量的数据库连接对象,存储与连接池中,需要用的时候就去取,用完还回来。数据库连接池就是为数据库的连接建立一个“缓冲区”,预先在“缓冲池”中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲区”中取出,使用完毕后再放回去,这样就不会有频繁的创建和销毁,从而节省系统的资源。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

对比传统的数据库连接,有以下缺点:

  • 普通JDBC使用DriverManager来获取,每次向数据库建立连接都将Connection加载到内存,执行完毕后再断开,这样会消耗大量的时间和资源,数据库的连接资源并没有被很好的利用,若同时几百人甚至几千人在线,频繁的进行数据库连接操作会占用很多资源,严重甚至会造成服务器的崩溃。
  • 每一次连接后都要断开,否则,程序会出现异常没能及时关闭会导致数据库系统中的内存泄露(java 内存泄露)
  • 不能控制被创建的连接对象,系统资源会毫无顾忌的分配出去,如连接过多,可能会导致服务器崩溃。

数据库连接池有以下优点:

  • 提高程序响应速度,减少创建连接的响应时间
  • 减低资源的消耗,可以重复使用以及提供数据库的连接
  • 便于管理

连接池市面上有很多,有druid(德鲁伊)、c3p0、dbcp……
其中 c3p0 和 dbcp 是国外的,druid 是国内常用的,是阿里巴巴做的一个开源技术,性能很好,如今全世界的Java程序员都可以使用。

使用步骤:
1、导入druid.jar包!!!;
2、创建一个 Properties 形式的配置文件,可以放在 src 目录下;
3、获取数据库连接池对象,通过工程的一个类来获取:DruidDataSourceFactory;
4、获取连接;

例程1 —— druid 数据线程池连接数据库,并遍历数据库的数据:

package com.test;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class Test {
	public static void main(String[] args) throws Exception {
		
		//加载配置文件
		Properties pro = new Properties();
		InputStream is = Test.class.getClassLoader().getResourceAsStream("druid.properties");
		pro.load(is);
		
		//获取连接池对象
		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
		
		//获取连接
        Connection con = ds.getConnection();
        
        //遍历数据库
        Statement stmt = con.createStatement();
        ResultSet res = stmt.executeQuery("SELECT * FROM tb_student");
        
        try {
			while(res.next()) {
				int id = res.getInt("id");
				String studentNumber = res.getString("studentNumber");
				String name = res.getString("name");
				String gender = res.getString("gender");
				String classAndGrade = res.getString("classAndGrade");
				String politicsStatus = res.getString("politicsStatus");
				String dateOfBirth = res.getString("dateOfBirth");
				String phone = res.getString("phone");
				String homeAddress = res.getString("homeAddress");
				
				System.out.print("序号:" + id + " ");
				System.out.print("学号:" + studentNumber + " ");
				System.out.print("姓名:" + name + " ");
				System.out.print("性别:" + gender + " ");
				System.out.print("班级:" + classAndGrade + " ");
				System.out.print("政治面貌:" + politicsStatus + " ");
				System.out.print("出生日期:" + dateOfBirth + " ");
				System.out.print("电话:" + phone + " ");
				System.out.print("家庭地址:" + homeAddress + " ");
				System.out.println();
			}
		}catch (Exception e) {
			System.out.println("遍历数据库失败,原因:");
			e.printStackTrace();
		}
	}
}

# druid.Properties文件配置备份

# 加载驱动
driverClassName = com.mysql.cj.jdbc.Driver
# url
url = jdbc:mysql://localhost:3306/test1?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
# 用户名
username = root
# 密码
password = 123456
# 初始连接数
initialSize = 10
# 最小连接
minIdle = 5
# 最大连接
maxActive = 50
# 超时时间
maxWait = 5000


工程配置如下:
在这里插入图片描述
运行结果中,7月 12, 2024 8:46:46 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited解释如下:
在这里插入图片描述

成功使用 druid 连接 MySQL 后,为了方便数据库连接池的连接,可以定义一个 Druid 的工具类,该工具封装了获取连接,关闭连接的方法。

2、编写JDBCUtils 工具类

成功使用 druid 连接 MySQL 后,为了方便数据库连接池的连接,可以定义一个 Druid 的工具类,该工具封装了获取连接,关闭连接的方法。
JDBCUtils.java

package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

//Druid 连接池的工具类
public class JDBCUtils {
    
    //定义成员变量
    @SuppressWarnings("unused")
    private static DataSource ds;
    
    static {
        try {
            
            //加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            
            //获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //获取连接
    public static Connection getConnection() throws SQLException{
        
        return ds.getConnection();
    }
    
    //释放资源
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        
        if(rs != null) {
            try {
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        if(stmt != null) {
            try {
                stmt.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null) {
            try {
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void close(Statement stmt, Connection conn) {
        close(null, stmt, conn);
    }
}

主方法:

package com.test;

import java.sql.*;

public class Test {
	public static void main(String[] args) throws Exception {
		
		Connection conn = null;
        Statement stmt = null;
        ResultSet res = null;
        
        try {
            //获取连接
            conn = JDBCUtils.getConnection();
            
            //查询遍历数据库
            stmt = conn.createStatement();
            res = stmt.executeQuery("SELECT * FROM tb_student");

            while(res.next()) {
				int id = res.getInt("id");
				String studentNumber = res.getString("studentNumber");
				String name = res.getString("name");
				String gender = res.getString("gender");
				String classAndGrade = res.getString("classAndGrade");
				String politicsStatus = res.getString("politicsStatus");
				String dateOfBirth = res.getString("dateOfBirth");
				String phone = res.getString("phone");
				String homeAddress = res.getString("homeAddress");
				
				System.out.print("序号:" + id + " ");
				System.out.print("学号:" + studentNumber + " ");
				System.out.print("姓名:" + name + " ");
				System.out.print("性别:" + gender + " ");
				System.out.print("班级:" + classAndGrade + " ");
				System.out.print("政治面貌:" + politicsStatus + " ");
				System.out.print("出生日期:" + dateOfBirth + " ");
				System.out.print("电话:" + phone + " ");
				System.out.print("家庭地址:" + homeAddress + " ");
				System.out.println();
			}
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(res, stmt, conn);
        }
	}
}

工程结构:
在这里插入图片描述

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

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

相关文章

Java多线程性能调优

Synchronized同步锁优化方法 1.6之前比较重量级,1.6后经过优化性能大大提升 使用Synchronized实现同步锁住要是两种方式:方法、代码块。 1.代码块 Synchronized在修饰同步代码块时,是由 monitorenter和monitorexit指令来实现同步的。进入mo…

mysql的事务,你弄懂了吗?(Innodb)

目录 1.事务的ACID原则 2. 事务的隔离级别 2.1 数据库的脏读问题 2.2 数据库不可重复读问题 2.3 数据库幻读问题 2.4 数据库脏写问题 3.Mysql的锁 3.1 以锁粒度的维度划分 3.2 以互斥性的维度划分: 3.3 以操作类型的维度划分: 3.4 以加锁方式…

树的概念与二叉树的实现

目录 一. 树的概念 二. 访问树的方法 1. 左孩子右兄弟法 2. 双亲表示法 3. 顺序表存孩子的指针(孩子表示法) 三. 二叉树 1. 二叉树的定义 2. 特殊二叉树 3. 二叉树的性质 4. 存储方式 四. 二叉树的前中后序遍历 1. 前序遍历 2. 中序遍历 3. …

C 语言中如何实现图结构?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代&…

基于docker-compose部署zabbix7.0

1.安装docker和docker-compose 已有可跳过,没有参照我的docker一件安装脚本连接放在下方 一键安装dockerv24.0.6以及docker-compose可离线_docker 24对应docker-compose-CSDN博客 2.运行zabbix-server 1.创建zabbix工作目录 mkdir /zabbix 2.编写docker-compos…

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类(audio-classification) 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …

【python】Python中常见的KeyError报错分析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

ESP32FreeRTOS开发笔记:1.双核并行

ESP32 的 Arduino 框架内部集成了 FreeRTOS,允许开发者利用其多任务处理功能。在代码中,xTaskCreatePinnedToCore 函数是 FreeRTOS 提供的 API,用于创建任务并指定任务在哪个核心上运行。 FreeRTOS 是一个流行的实时操作系统内核,…

信息打点web篇--语言开发框架,组件识别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本章节主要整理 识别语言开发框的打点内容 框架简介 高效理解:把用于做某些事的代码封装起来,使用者无需自己写代码直接一个函数就能完成本该很多行才能完成的功能。 例子:我们要写网站,…

Open3D 点云Kmeans聚类算法

目录 一、概述 1.1算法介绍 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2聚类后点云 前期试读,后续会将博客加入该专栏,欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 1.1算法介绍 聚类是一种将数据集分组的方…

Qml 图片和加载器操作

学习目标:Qml 图片和加载器编程 学习前置 Qt Qml编程 基础部分 认识qml-CSDN博客 实现效果 对图片的基本操作 加载器 核心代码 加载器 思路: 创建一个加载器 默认是几个圆点,我们重写加载器元素(contentItem)&…

文献阅读:高效和稳健的 π-FISH rainbow 用于多种生物分子的多重原位检测

文献介绍 文献题目: Highly efficient and robust π-FISH rainbow for multiplexed in situ detection of diverse biomolecules 研究团队: 曹罡(华中农业大学)、戴金霞(华中农业大学) 发表时间&#xff…

RSA算法(C++)

RSA加解密过程 RSA为非对称加密算法,由一对公钥和一对私钥构成,私钥加密公钥解密,公钥加密私钥解密 如下图,D为私密的,假设传输英文字母,我们给英文字母编号A1,B2,C3… RSA加解密过程 两对密钥产生方法如下 C Op…

网络通信基本知识

网络通信 什么是网络通信? 通信网络是指将各个孤立的设备进行物理连接,实现人与人,人与计算机,计算机与计算机之间进行信息交换的链路,从而达到资源共享和通信的目的。 什么是网络协议? 网络协议是计算机…

Python函数 之 参数

1.参数的简单介绍 参数 形式参数(形参):在函数定义的时候,在括号中写⼊变量,这个变量就称为是函数的参数。实际参数(实参):在函数调⽤的时候,可以给定义时候的形参传递具体的数据值,供其使⽤。注: 在函数调⽤的时候,会将函数的实…

wps 将列的内容转换为一个单元格内容,并以逗号分隔

wps 将列的内容转换为一个单元格内容,并以逗号分隔 1.首先在一个空白单元格输入 2.输入函数TEXTJOIN 这个函数有三个参数,第一个:以什么分隔符分隔,第二个:是否忽略空白格,true:忽略 false:不忽略 第三个&…

怎么使用代理IP?如何检测代理IP是否有效?

代理IP是一种网络代理技术,它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时,我们的真实IP地址会被隐藏起来,而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下: 1.选择合适的代理服务器 考虑服务…

【微信小程序知识点】转发功能的实现

转发功能,主要帮助用户更流畅地与好友分享内容与服务。 想实现转发功能,有两种方式: 1.页面js文件必须声明onShareAppMessage事件监听函数,并自定义转发内容。只有定义了此事件处理函数,右上角菜单才会显示“转发”按…

WebStorm 使用 ESLint 自动格式化代码

WebStorm 不能像 VSCode 那样在保存的时候自动 Fix-ESLint,不能自动格式化代码,需要安装一个插件 安装 ESLint 插件 进入设置快捷键 win:CtrlAltS mac: command, 找到 Plugins,搜索eslint 在这里插入图片描述 安装后配置一下 …

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释: RTCM响应消息1020为GLONASS星历信息,暂不介绍,前公司暂未研发RTCM消息类型版本的DR/RTK模块,DR/RTK模块仅NMEA消息类型使用 注释: 公司使用的多信号语句类型为MSM4&MSM7,也应该是运用最广泛的语句…