前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Druid MySQL连接池本地实践

Druid MySQL连接池本地实践

作者头像
FunTester
发布于 2024-04-03 12:35:34
发布于 2024-04-03 12:35:34
42300
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

本来不打算写这个题目的,因为 Druid 大多都是在 Spring 中使用的,它很多功能非常强大,但是对于 MySQL 性能测试中并不实用。但是由于特殊原因,还是得把这个拾起来。

在以前的性能测试的过程当中,我通常会采用 线程绑定连接 的方式进行测试,毕竟也用不到很多线程,再不济我就用 common-pool2 自己写一个。但是考虑到稳定性测试当中,持续时间非常久,自定义的功能缺少自愈能力,最终还是选择了使用已有成熟的 MySQL 连接池工具,经过几番对比,最后选择了 Druid

Druid简介

Druid连接池是阿里巴巴开源的数据库连接池项目,为监控而生,内置强大的监控功能,且监控特性不影响性能。Druid连接池功能强大,性能优越,使用占比高,是一款优秀的数据库连接池

Druid连接池的主要特点包括:

  • 高性能: Druid连接池采用了一系列性能优化策略,包括预先创建连接、连接池复用、有效的连接验证等,以提供高效的数据库连接获取和释放操作。
  • 可靠性: Druid连接池提供了多种故障处理机制,可以有效地应对各种异常情况,确保数据库连接的可靠性。
  • 可管理性: Druid连接池提供了丰富的监控和统计功能,可以实时监控连接池的状态、活动连接数、请求频率、SQL执行情况等,方便用户进行管理和优化。
  • 安全性: Druid连接池内置了防火墙功能,可以有效地防止SQL注入攻击,并提供审计功能,可以帮助用户追踪数据库操作行为。
  • 扩展性: Druid连接池支持多种数据库类型,并可以方便地扩展支持新的数据库类型。

Druid连接池的使用非常简单,只需几行代码即可配置和使用,是Java应用开发中不可多得的利器。

一个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void main(String[] args) {  
    // 创建 Druid 数据源  
    DruidDataSource dataSource = new DruidDataSource()  
    // 配置数据库连接信息  
    dataSource.setUrl("jdbc:mysql://localhost:3306/funtester")  
    dataSource.setUsername("root")  
    dataSource.setPassword("funtester")  
    // 获取数据库连接  
    Connection connection = dataSource.getConnection()  
    // 执行 SQL 语句  
    Statement statement = connection.createStatement()  
    def query = statement.executeQuery("select id, uid, create_time  from record order by id desc limit 10;")  
    while (query.next()) {  
        println("id: ${query.getInt(1)}, uid: ${query.getInt(2)}, create_time: ${query.getTimestamp(3)}")  
    }  
    query.close()  
    // 关闭数据库连接  
    statement.close()  
    connection.close()  
}

控制台打印信息就不再展示了。

Druid配置项

上面例子中我们采取先创建 com.alibaba.druid.pool.DruidDataSource 对象,然后进行配置项设置。我们还有一种语法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 配置Druid连接池属性  
Properties properties = new Properties()  
properties.put("driverClassName", "com.mysql.cj.jdbc.Driver")  
properties.put("url", "jdbc:mysql://localhost:3306/funtester")  
properties.put("username", "root")  
properties.put("password", "funtester")  
properties.put("maxActive", "2")
  
// 创建Druid连接池  
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties)

Druid连接池提供了非常丰富的配置参数,可以根据实际需求进行定制化配置,下面列出了一些常用的配置项:

  1. 基本配置:
    • driverClassName: 数据库驱动类名
    • url: 数据库URL连接字符串
    • username: 数据库用户名
    • password: 数据库密码
  2. 初始化配置:
    • initialSize: 初始化连接池时创建的连接数量,默认0
    • maxActive: 连接池中可同时连接的最大的活动的连接数,默认8
    • maxIdle: 连接池中最大的空闲的连接数,太大may会使系统稍慢,若有批量执行查询请增大该值,默认8
  3. 超时时间配置:
    • maxWait: 获取连接时最大等待时间(毫秒),超过则抛出异常,小于0则无限等待,默认无限
    • timeBetweenEvictionRunsMillis: 对象被过期前的休息时间,用于检测连接是否被占用,避免因其他原因长时间占用而不能被检测并从而移除废弃连接。默认1分钟
    • minEvictableIdleTimeMillis: 连接在池中最小生存的时间,单位是毫秒,默认30分钟
  4. 测试配置:
    • testWhileIdle: 是否在从连接池取连接时检测连接有效性,默认false,非常耗时
    • testOnBorrow: 是否在连接池中取出连接前进行检测连接有效性,默认true,建议设置为false,性能更好
    • testOnReturn: 是否在连接池中归还连接时检测连接有效性,默认false
  5. 空闲连接回收配置:
    • removeAbandoned: 是否允许连接池中连接被回收,默认false
    • removeAbandonedTimeout: 应该回收过期连接的时间,单位为秒,默认300
    • logAbandoned: 是否按指定时间输出连接回收的记录,默认false
  6. 其他配置:
    • filters: 配置一些扩展插件,常用的有stat(计算一些统计数据)、log4j(使用log4j记录连接池日志)、wall(用于防止SQL注入)等
    • validationQuery: 用来检测连接是否有效的sql,这个会在应用程序每次申请连接时执行,类似select 1
    • accessToUnderlyingConnectionAllowed: 是否允许访问底层连接,true则允许用户获取到物理连接,默认false

以上是一些Druid连接池常用的配置参数,在配置时可以根据项目实际情况进行调整。比如对于长时间保持空闲状态的应用可以将maxIdle设置小一些,而对于并发量大的应用则需要将maxActive设置大一些。配置合理的连接池参数有利于提升应用的性能和稳定性。

并发

在性能测试过程中少不了要对连接池并发获取连接、归还连接。下面是演示的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.alibaba.druid.pool.DruidDataSource  
import com.alibaba.druid.pool.DruidDataSourceFactory  
import com.funtester.frame.SourceCode  
  
import java.sql.Connection  
import java.util.concurrent.CountDownLatch  
import java.util.concurrent.ExecutorService  
import java.util.concurrent.Executors  
  
class DruidConcurrencyDemo extends SourceCode {  
  
    private static DruidDataSource dataSource  
  
    static {  
        try {  
            // 配置Druid连接池属性  
            Properties properties = new Properties()  
         properties.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, "com.mysql.cj.jdbc.Driver")
         properties.put(DruidDataSourceFactory.PROP_URL, "jdbc:mysql://localhost:3306/funtester")
         properties.put(DruidDataSourceFactory.PROP_USERNAME, "root")
         properties.put(DruidDataSourceFactory.PROP_PASSWORD, "funtester")
         properties.put(DruidDataSourceFactory.PROP_MAXACTIVE, "10")
         properties.put(DruidDataSourceFactory.PROP_INITIALSIZE, "3")
         properties.put(DruidDataSourceFactory.PROP_MAXWAIT, "5000")

            // 创建Druid连接池  
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties)  
        } catch (Exception e) {  
            e.printStackTrace()  
        }  
    }  
  
    static void main(String[] args) throws InterruptedException {  
        int threadCount = 4 // 模拟4个并发请求  
        CountDownLatch latch = new CountDownLatch(threadCount)  
        ExecutorService executorService = Executors.newFixedThreadPool(threadCount)  
  
        // 并发获取连接  
        for (int i = 0; i < threadCount; i++) {  
            executorService.execute(() -> {  
                try {  
                    Connection connection = dataSource.getConnection()  
                    // 模拟一些操作  
                    Thread.sleep(1000) // 模拟1秒的操作时间  
                    output("活跃连接数: " + dataSource.getActiveCount())  
                    output("空闲连接数: " + dataSource.getPoolingCount())  
                    connection.close() // 关闭连接  
                } catch (Exception e) {  
                    e.printStackTrace()  
                } finally {  
                    latch.countDown() // 计数器减一  
                }  
            })  
        }  
  
        latch.await() // 等待所有线程执行完毕  
        executorService.shutdown() // 关闭线程池  
  
        // 获取连接池状态  
        output("活跃连接数: " + dataSource.getActiveCount())  
        output("空闲连接数: " + dataSource.getPoolingCount())  
    }  
}

控制台输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
16:31:55:819 pool-2-thread-3 {dataSource-1} inited
16:31:57:353 pool-2-thread-1 活跃连接数: 2
16:31:57:353 pool-2-thread-2 活跃连接数: 2
16:31:57:354 pool-2-thread-1 空闲连接数: 0
16:31:57:354 pool-2-thread-2 空闲连接数: 0
16:31:58:365 pool-2-thread-3 活跃连接数: 2
16:31:58:365 pool-2-thread-4 活跃连接数: 2
16:31:58:365 pool-2-thread-3 空闲连接数: 0
16:31:58:366 pool-2-thread-4 空闲连接数: 0
16:31:58:369 main 活跃连接数: 0
16:31:58:370 main 空闲连接数: 2

如果你在设置中增加了 com.alibaba.druid.pool.DruidDataSourceFactory#PROP_MAXIDLE = "maxIdle";的话,控制台会提示:

main maxIdle is deprecated

该配置已经过期了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库连接池为什么首选Druid
Druid是阿里巴巴的一个开源项目,号称为监控而生的数据库连接池,在功能、性能、扩展性方面都超过其他,例如 DBCP、C3P0、BoneCP、Proxool、JBoss、DataSource 等连接池,而且Druid已经在阿里巴巴部署了超过600个应用,通过了极为严格的考验,这才收获了大家的青睐!
微观技术
2021/03/11
9970
数据库连接池为什么首选Druid
Driud数据库连接池的使用
上面是比较官方的介绍,解释起来还是蛮简单的,就是构建起一个池子,然后把经常需要用的对象放到里面,然后每次调用的时候,就直接取出来就可以了,不需要再次new一个,这样可以节约很多时间。
GeekLiHua
2025/01/21
1640
Driud数据库连接池的使用
Druid连接池的基本配置与使用
Druid是阿里巴巴的开源连接池组件,是世界上最好的连接池之一。Druid能对数据库连接进行有效管理和重用,最大化程序执行的效率。连接池负责创建和管理连接,程序只负责取用与归还。
害恶细君
2022/11/22
2.3K0
Druid连接池的基本配置与使用
常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
用户2409797
2018/08/30
1.7K0
Druid连接池技术实践
Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
张哥编程
2024/12/13
1940
Druid连接池技术实践
Springboot+druid数据库连接池使用「建议收藏」
使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。
全栈程序员站长
2022/09/29
1.2K0
Springboot+druid数据库连接池使用「建议收藏」
详解数据库连接池 Druid
在 Spring Boot 项目中,数据库连接池已经成为标配,然而,我曾经遇到过不少连接池异常导致业务错误的事故。很多经验丰富的工程师也可能不小心在这方面出现问题。
勇哥java实战
2023/12/09
2.6K0
【Java 进阶篇】JDBC数据库连接池Druid详解
在Java应用程序中,与数据库进行交互是一个常见的任务。为了更有效地管理数据库连接并提高性能,数据库连接池是一种常见的解决方案。Druid是一个流行的JDBC数据库连接池,它具有丰富的功能和高性能。本博客将详细介绍Druid连接池,包括它的优点、配置、使用方法以及示例代码。
繁依Fanyi
2023/10/12
4.8K0
【Java 进阶篇】JDBC数据库连接池Druid详解
MySQL连接池DataSource怎么使用?
在高并发的Web应用中,数据库连接的管理是至关重要的。数据库连接作为一种稀缺资源,如果每次请求都新建和关闭连接,将大大降低系统的性能和响应速度。因此,使用连接池来复用数据库连接成为了一种广泛采纳的解决方案。本文将深入探讨连接池的概念,特别是DruidDataSource,这一高效、稳定的数据库连接池组件,通过丰富的代码示例和实践经验分享,帮助开发者更好地理解和使用连接池,提升应用性能。
程序猿川子
2024/07/17
3460
MySQL连接池DataSource怎么使用?
【JDBC】数据库连接池:德鲁伊druid的使用
(点击进入专栏) 【1】idea添加mysql-jar包 【2】使用IDEA连接数据库,执行增删改操作。 【3】IDEA连接数据库,执行查询操作,返回结果集并输出。 【4】JDBC实战 水果库存系统 [设计阶段] 【5】 水果库存系统 [功能实现①](接口实现类FruitDAOImpl) 【6】 水果库存系统 [功能实现②] 功能完善+使用效果 【7】 水果库存系统 [代码优化] 【8】连接数据库,执行批处理操作。 【9】数据库连接池:德鲁伊druid的使用
.29.
2022/11/15
2.1K0
【JDBC】数据库连接池:德鲁伊druid的使用
为什么说druid是目前最好的数据库连接池?
数据库连接是一项非常关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。
Java极客技术
2022/12/04
1.1K0
为什么说druid是目前最好的数据库连接池?
[数据库连接池] Java数据库连接池--DBCP浅析.
前言 对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新).  一. 为何要使用数据库连接池 假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出
一枝花算不算浪漫
2018/05/18
1.6K0
Quartz学习笔记(四)使用druid连接池
quartz默认使用的是c3p0的连接池,记得有篇文章测试过c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool这四种连接池的性能。 大致给出的测试数据为Druid >Tomcat Jdbc Pool >c3p0 >Proxool,以上仅供参考。 最近项目老是报错,甚是让人烦恼,具体错误日志: The last packet successfully received from the server was 56,268 milliseconds ago. The last pa
小柒2012
2018/04/13
3.4K0
2. 第三方连接池
在前面的章节中,我们虽然写了下自定义连接池,但是那只是为了更好理解连接池原理而已。在真正的工作中,我们使用最多的还是第三方连接池。
Devops海洋的渔夫
2021/10/12
6990
聊聊druid连接池的参数配置
druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidDataSourceFactory.java
code4it
2023/09/28
1.1K0
数据库连接池入门(c3p0、Druid)
数据库连接池其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
共饮一杯无
2022/11/28
4720
数据库连接池入门(c3p0、Druid)
JavaJDBC:连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
栗筝i
2022/12/01
7240
Druid连接池的使用
如果觉得老调不好,可以DruidDataSource dataSource = new DruidDataSource(); 再调用setter方法使用配置文件的值,不过很麻烦。
用户7353950
2022/05/10
1.3K0
【Java 进阶篇】JDBC数据库连接池Druid工具类详解
在Java应用程序中,数据库连接是一种重要的资源,因为每次创建和销毁数据库连接都会产生开销,降低了系统性能。为了高效地管理数据库连接,降低资源消耗,常常使用数据库连接池。Druid是一个功能强大的数据库连接池,本文将详细介绍如何使用Druid连接池及其工具类。
繁依Fanyi
2023/10/12
1.4K0
【Java 进阶篇】JDBC数据库连接池Druid工具类详解
【JDBC】使用连接池重写工具类
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
陶然同学
2023/02/24
5710
【JDBC】使用连接池重写工具类
推荐阅读
相关推荐
数据库连接池为什么首选Druid
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档