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

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);
        }
	}
}

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

Druid连接池是一个高效、可靠的数据库连接池。它支持多种数据库,包括MySQL。使用Druid连接池可以大大提高应用程序的数据库访问性能。 要使用Druid连接连接MySQL数据库,需要在项目中引入DruidMySQL的依赖包。然后,在配置文件中配置Druid连接池的相关参数,包括数据库连接URL、用户名、密码、驱动类等。具体的配置方式可以参考Druid官方文档。 下面是一个简单的配置示例: ``` # 数据库连接池配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 连接池配置 spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=20 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,log4j spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` 配置好之后,就可以在代码中通过Druid连接池获取数据库连接,并执行SQL语句了。例如: ``` // 获取数据库连接 Connection conn = dataSource.getConnection(); // 执行SQL语句 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM user"); while (rs.next()) { System.out.println(rs.getString("name")); } // 关闭连接 rs.close(); stmt.close(); conn.close(); ``` 需要注意的是,使用完数据库连接后一定要及时关闭连接,释放资源,否则会造成连接泄漏和系统资源浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明n.n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值