当前位置: 首页 > news >正文

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

文章目录

  • 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"));//获取DataSourceds = 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);}}
}

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ElasticSearch】ES 5.6.15 向量插件支持
  • 软件供应链安全:如何防范潜在的攻击?
  • 机器学习筑基篇,Jupyter Notebook 精简指南
  • Docker搭建kafka+zookeeper以及Springboot集成kafka快速入门
  • 暑假自律日记十二
  • 同步与异步:.NET 中的 Task.WaitAll 和 Task.WhenAll
  • SpringMVC框架--个人笔记步骤总结
  • 04.为什么line-height是无单位的 兄弟元素淡出效果 蚀刻文字效果
  • uniapp vue3微信小程序如何获取dom元素
  • 什么? CSS 将支持 if() 函数了?
  • JavaScript中的面向对象编程
  • 数据高效交互丨DolphinDB Redis 插件使用指南
  • 数据结构(Java):树二叉树
  • 前端数据加密方式
  • 《Windows API每日一练》9.13资源-鼠标位图和字符串
  • [NodeJS] 关于Buffer
  • FastReport在线报表设计器工作原理
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PHP 7 修改了什么呢 -- 2
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue组件定义
  • Web标准制定过程
  • - 概述 - 《设计模式(极简c++版)》
  • 机器学习 vs. 深度学习
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 全栈开发——Linux
  • 一个JAVA程序员成长之路分享
  • 移动端 h5开发相关内容总结(三)
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​​​【收录 Hello 算法】9.4 小结
  • ​人工智能书单(数学基础篇)
  • #70结构体案例1(导师,学生,成绩)
  • #QT(一种朴素的计算器实现方法)
  • (function(){})()的分步解析
  • (PADS学习)第二章:原理图绘制 第一部分
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八)Flask之app.route装饰器函数的参数
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • @Mapper作用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [AIGC] Java 和 Kotlin 的区别
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [C语言]编译和链接
  • [ffmpeg] x264 配置参数解析
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [JavaEE]线程的状态与安全