【Java 进阶篇】JDBC数据库连接池Druid工具类详解

news2024/11/16 23:56:17

在这里插入图片描述

在Java应用程序中,数据库连接是一种重要的资源,因为每次创建和销毁数据库连接都会产生开销,降低了系统性能。为了高效地管理数据库连接,降低资源消耗,常常使用数据库连接池。Druid是一个功能强大的数据库连接池,本文将详细介绍如何使用Druid连接池及其工具类。

1. 什么是Druid连接池

Druid是阿里巴巴开源的一个数据库连接池实现,它结合了传统数据库连接池的优点和一些独特的功能。Druid连接池具有如下特点:

  • 高效:Druid连接池采用了一些高效的技术,如预编译语句缓存、连接池预热等,可以提高数据库访问的效率。

  • 安全:Druid连接池内置了防SQL注入功能,可以有效地防止SQL注入攻击。

  • 强大的监控和统计功能:Druid连接池可以监控连接池的状态,包括活跃连接数、空闲连接数、执行SQL的次数等,可以帮助开发人员更好地了解应用程序的性能。

  • 配置灵活:Druid连接池提供了丰富的配置选项,可以根据应用程序的需求进行灵活配置。

2. 导入Druid库

要使用Druid连接池,首先需要在项目中导入Druid库。可以通过Maven或手动下载jar包来导入Druid库。

Maven依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

3. 配置Druid连接池

配置Druid连接池需要创建一个DruidDataSource对象,并设置一些连接属性,如数据库URL、用户名、密码等。以下是一个简单的Druid连接池配置示例:

import com.alibaba.druid.pool.DruidDataSource;

public class DruidUtils {
    private static DruidDataSource dataSource;

    static {
        dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
    }

    public static DruidDataSource getDataSource() {
        return dataSource;
    }
}

在上面的示例中,我们创建了一个DruidDataSource对象并设置了数据库的URL、用户名和密码。这是一个简单的配置示例,您可以根据实际需求设置更多的属性,如连接池大小、最大活跃连接数、初始化连接数等。

4. 获取数据库连接

使用Druid连接池,您可以通过DruidDataSource对象来获取数据库连接。以下是一个获取数据库连接的示例:

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class DruidUtils {
    // 省略其他代码

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

在上面的示例中,我们定义了一个getConnection方法,该方法可以获取一个数据库连接。注意要处理SQLException异常。

5. 关闭数据库连接

使用完数据库连接后,一定要及时关闭以释放资源。Druid连接池的连接是可以重复使用的,所以在关闭连接时,实际上是将连接归还给连接池,而不是真正地关闭连接。

以下是一个关闭数据库连接的示例:

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class DruidUtils {
    // 省略其他代码

    public static void close(Connection conn, Statement stmt) {
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (conn != null) {
                conn.close(); // 归还连接给连接池
            }
        } catch (SQLException e) {
        	e.printStackTrace();
        }
    }
}

6. 编写Druid工具类

为了更方便地使用Druid连接池,我们可以编写一个Druid工具类,该工具类封装了获取连接、关闭连接等操作。

以下是一个简单的Druid工具类示例:

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

import java.sql.SQLException;

public class DruidUtils {
    private static DruidDataSource dataSource;

    static {
        dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
    }

    public static DruidPooledConnection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(DruidPooledConnection connection) {
        if (connection != null) {
            try {
                connection.close(); // 归还连接给连接池
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的示例中,我们将DruidPooledConnection对象用于获取连接,而不是Connection对象,以便于后续的连接管理。同时,我们编写了一个close方法用于关闭连接。这个工具类可以进一步封装其他常用的数据库操作。

7. 编写Druid示例代码

接下来,我们将编写一个示例代码,展示如何使用Druid连接池进行数据库操作。假设我们有一个User表,我们将编写一个查询所有用户的示例代码。

import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    public static void main(String[] args) {
        DruidPooledConnection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = DruidUtils.getConnection();
            String sql = "SELECT * FROM user";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                String email = resultSet.getString("email");

                System.out.println("ID: " + id + ", Username: " + username + ", Email: " + email);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DruidUtils.close(connection);
        }
    }
}

在上面的示例中,我们首先通过DruidUtils获取数据库连接,然后使用PreparedStatement执行SQL查询语句,最后关闭连接。这个示例展示了如何使用Druid连接池执行查询操作。

8. 总结

Druid连接池是一个功能强大的数据库连接池,在高并发的Java应用中具有良好的性能和安全性。通过配置和使用Druid连接池,您可以更好地管理数据库连接,提高应用程序的性能和安全性。希望本文的介绍和示例对您有所帮助,让您更加熟悉如何使用Druid连接池。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

成品短视频App源码:10个最热门的功能模块详解

作为成品短视频App源码领域的专家&#xff0c;我将为您揭开成品短视频App的神秘面纱。在这篇文章中&#xff0c;我将详细介绍这热门应用背后的10个最受欢迎的功能模块。无论您是想开发一款创新的短视频App&#xff0c;还是寻找适合您业务的现成解决方案&#xff0c;本文都会为您…

递归

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;汉诺塔 &#x1f449;&…

C#Winform新建工程

C#Winform新建工程 选择创建新项目 搜索窗体 填写工程名称和位置

第四课 递归、分治

文章目录 第四课 递归、分治lc78.子集--中等题目描述代码展示 lc77.组合--中等题目描述代码展示 lc46.全排列--中等题目描述代码展示 lc47.全排列II--中等题目描述代码展示 lc226.翻转二叉树--简单题目描述代码展示 lc98.验证二叉搜索树--中等题目描述代码展示 lc104.二叉树的最…

八、Thymeleaf链接表达式

链接表达式使用&#xff20;符开头&#xff0c;用于描述一个URL&#xff0c;url可以是相对的&#xff0c;也可以是绝对的。当为相对路径时&#xff0c;此表达式用于在指定的URI前拼接项目的根路径&#xff0c;相当于request.getContextPath()。当为绝对路径时&#xff0c;路径按…

纳百川冲刺创业板上市:计划募资约8亿元,宁德时代为主要合作方

近日&#xff0c;纳百川新能源股份有限公司&#xff08;下称“纳百川”&#xff09;向深交所创业板递交的上市申请材料获得受理&#xff0c;浙商证券为其独家保荐人。 本次冲刺上市&#xff0c;纳百川计划募资8.29亿元&#xff0c;将用于纳百川&#xff08;滁州&#xff09;新能…

【力扣-每日一题】901. 股票价格跨度

暴力解法&#xff1a; class StockSpanner { private:vector<int> pri; public:StockSpanner() {}int next(int price) {pri.emplace_back(price);int count0;for(int ipri.size()-1;i>0;i--){if(pri[i]<price)count;else break;}return count;} };/*** Your Stoc…

软件工程与计算总结(五)软件需求基础

本帖介绍软件需求涉及的诸多基本概念&#xff0c;通过对这些概念的阐述&#xff0c;剖析软件需求的来源、层次、类别、作用等重要知识~ 目录 ​编辑 一.引言 二.需求工程基础 1.简介 2.活动 3.需求获取 4.需求分析 5.需求规格说明 6.需求验证 7.需求管理 三.需求基…

第85步 时间序列建模实战:CNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍CNN回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrome i…

比特币的惊人飙升:“ 自最初定价高于零以来,价格飙升了 3,600,000,000% !“

10 月6 日是第一个比特币用户计算比特币价格的周年纪念日&#xff0c;这表明他们愿意购买或出售数字货币。 14年前的这一天&#xff0c;比特币价格诞生了。 正如比特币历史学家Pete Rizzo今天在 X 上发表的一篇文章中指出的那样 &#xff0c;”10 月 6 日是早…

【时间之外】EA交易代码入门

目录 MetaEditor简介 最简单的EA交易代码 代码编译 EA附加到图表 EA测试 EA正式上线 注意事项 本不打算写这篇文章&#xff0c;后来看到CSDN里有很多介绍交易软件的文章&#xff0c;平时也碰到很多人问我自动化交易的问题&#xff0c;还是写一篇科普文章&#xff0c;毕竟…

详细介绍区块链之挖矿

对不起&#xff0c;大家&#xff0c;这篇文章对作者来说实在是太有意义和含金量了&#xff0c;作者想把它设置为关注博主才能见全文&#xff0c;请大家理解&#xff01;如果觉得还是看不懂&#xff0c;抱歉耽误大家的时间&#xff0c;就请取消关注&#xff01;&#xff01;&…

开源即时通讯IM框架 MobileIMSDK v6.4 发布

一、更新内容简介 本次更新为次要版本更新&#xff0c;进行了若干优化&#xff08;更新历史详见&#xff1a;码云 Release Notes、Github Release Notes&#xff09;。MobileIMSDK 可能是市面上唯一同时支持 UDPTCPWebSocket 三种协议的同类开源IM框架。 二、MobileIMSDK简介…

EverWeb for Mac:轻松创建出色网站的强大网页设计软件

如果你正在寻找一款优质的网页设计软件&#xff0c;那么EverWeb for Mac绝对值得考虑。这款软件旨在为用户提供专业级的网站建设工具&#xff0c;帮助你轻松创建出令人印象深刻的网站。 在EverWeb for Mac中&#xff0c;用户可以快速轻松地创建网站布局和设计。该软件支持各种…

Linux 系统为何产生大量的 core 文件?

Author&#xff1a;rab 目录 一、问题分析二、解决方案扩展 一、问题分析 上一篇刚讲到《Docker 配置基础优化》&#xff0c;这里再补充一下。就在中秋国庆这段小长假里&#xff0c;接收到了线上服务器磁盘告警通知&#xff0c;线上服务器架构是一个 Docker Swarm 集群&#x…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

一个例子帮您掌握python正则re.match、re.search和re.findall的区别

在使用python正则进行字符串匹配查询时&#xff0c;最常用的三个函数是re.match、re.search和re.findall&#xff0c;在这里我就用一个例子带大家了解这三者的使用区别&#xff0c;话不多说我们直接上代码&#xff01; import re txt"test,a:123,b:1234,c:12345,hello!&…

二叉树--翻转二叉树

文章前言&#xff1a;如果有小白同学还是对于二叉树不太清楚&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 如果思路不清楚&#xff0c;请看动态页面&am…

二叉树--对称二叉树

小白同学对于二叉树还是不太了解的&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 对称二叉树-力扣 101 题 作者给的图&#xff1a; 代码&#xff1a; public boolean isSymmetric(TreeNode root) {//刚刚开始&#xff0c;传入的是顶堆的左、右…

短视频矩阵源码开发部署---技术解析

一、短视频SEO源码搜索技术需要考虑以下几点&#xff1a; 1. 关键词优化&#xff1a;通过研究目标受众的搜索习惯&#xff0c;选择合适的关键词&#xff0c;并在标题、描述、标签等元素中进行优化&#xff0c;提高视频的搜索排名。 2. 内容质量&#xff1a;优质、有吸引力的内…