Druid连接池_druid会自动释放资源吗-程序员宅基地

技术标签: java  JDBC  数据库  

连接池

1.概念:首先我们先了解什么是连接池。我们在编写JDBC程序时通常的步骤是注册驱动、获取连接、获得执行SQL语句对象、增删改查数据,也就是说每一个对数据库记录的操作都要执行一遍这些步骤。一个java程序的业务逻辑层就是通过调用每一个数据库表格对应的数据管理类来完成业务操作,也就是说一个java程序有多个数据管理类而且这些类需要多次调用。如果每次调用执行数据管理类需要执行之前的那些操作那样的话执行效率很低,而我们不难发现其实每一次执行JDBC类其中有些操作是相同的,如注册驱动、获取连接、获得执行SQL语句对象,那这些获得的资源就可以把它们包装成工具类,用来使用,这样整个java程序执行的效率就会大大提升。由此,连接池的概念诞生。连接池简单来说就是储存和管理连接对象,它会在整个程序启动前就创建一定数量的连接对象,其他类调用连接池的某些方法获得连接、归还连接。
2.连接池的实现原理:连接池,储存和管理连接对象。储存,我们可以将创建的连接对象储存在数组或者集合中。而管理,就是定义方法从存放连接的数组或集合中获取连接。为了方便使用连接池,将连接池包装成工具类,即连接池的成员变量、方法都用静态修饰。

Druid连接池

1.概念:Druid是由阿里巴巴开发的开源的JDBC连接池、监控组件(但是在这里仅介绍它连接池的功能)。阿里巴巴将连接池一系列方法包装成一个工具供我们方便直接使用。
2.下载架包:要使用Druid这个工具,引入相关架包。

下载链接:https://repo1.maven.org/maven2/com/alibaba/druid/

下载最新版本,将架包引入java程序即可使用Druid连接池。

3.Druid使用关键类及相关操作:Druid这个组件还有其他功能的类,但是这里作为初学者,仅介绍连接池的相关的关键类。

  • 关键类DruidDataSource:就是我们需要的连接池
  • 获取DruidDataSource对象:
DataSource dataSource = new DataSource();
  • 配置连接池:获得连接池后,还需我们配置连接数据库的参数
		dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/practise?useUnicode=true&characterEncoding=utf8&useSSL=true");
        dataSource.setUsername("root");
        dataSource.setPassword("1234");
  • 获取连接对象:通过调用连接池的getConnection方法获取连接对象
Connection connection = dataSource.getConnection();
  • 释放资源

    我们用完连接后需要释放资源,之前通常我们都是通过连接对象的close方法直接销毁连接对象来释放资源,而现在我们使用了连接池了,我们使用完连接对象后需要的是归还连接池。而在实际开发中为了方便使用连接池,我们通常会在连接池中强化Connection类的close方法,从而实现从连接池获得连接对象调用close方法直接执行归还连接的操作。Druid连接池就已经帮我们强化Connection类的close方法,我们可以直接通过调用从连接池获得的连接对象的close方法完成归还连接的操作。
  • 配置文件配置连接池
    之前我们配置连接池是通过某些方法来配置连接池,但是在实际开发中我们这样配置连接池,如果需要更改连接数据库的一些参数,那就很麻烦。我们就需要通过资源文件来配置连接池。
    1)编写资源文件
    这里以编写properties资源文件为例
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/practise?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=1234

注意:这里driverClassName、url等参数名应原样编写,大小写不能错误,因为配置连接池就是通过调用properties类来获取参数,而properties类获取资源就是就是通过参数名来获取的。
2)资源文件配置连接池
编写好资源文件后,我们就需要通过资源文件来配置连接池。首先我们需要将资源文件写入内存中,然后用过DruidDataSourceFactor.createDataSource(properties)此方法创建连接池,参数为Properties类对象。

Properties properties = new Properties();
//将资源文件写入内存中,参数为资源文件的路径
properties.load(new FileInputStream("src/main/java/com/mysql/jdbc/mysql.properties"));
//创建并配置连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  • 再次包装
    在创建连接池后,我们不能发现整个程序只需要一个连接池那我们则可以再次包装一个工具类,这个类只创建一个连接池,定义一个方法调用连接池的getConnection方法来返回一个连接对象。
public class DruidJdbc{
    


    /**
     * 创建一个连接池
     */
    private static final DataSource dataSource;
	//初始化创建并配置连接池
    static {
    
        Properties properties = new Properties();
        try {
    
            properties.load(new FileInputStream("src/main/java/com/mysql/jdbc/mysql.properties"));
        } catch (IOException e) {
    
            e.printStackTrace();
        }
        DataSource dataSource1;
        try{
    
            dataSource1 = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
    
            e.printStackTrace();
            dataSource1 = null;
        }
        dataSource = dataSource1;
    }


    /**
     * 返回连接池
     * */
    public static DataSource getDataSource(){
    
        return dataSource;
    }


    /**
     * 获取连接对象
     */
    public static Connection getConnection(){
    
        try {
    
            return dataSource.getConnection();
        } catch (SQLException e) {
    
            e.printStackTrace();
            return null;
        }  
    }

}

总结

以上就是Druid连接池简单用法。通过连接池可以简化我们在编写JDBC的代码,同时也大大提高程序的执行效率。其实我们再回头看看每个编写的JDBC程序会发现,大多JDBC程序基本就一个SQL语句不同,其他代码基本相同,于是就有Dbutils工具,它又更好地帮我们简化了编写JDBC的代码,感兴趣的可以了解一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_51656823/article/details/116356092

智能推荐

Lucene in action前30页_assertequeals-程序员宅基地

文章浏览阅读749次。Lucene in Action(中文版) -------------------------------------------------------------------------------- Lucene in Action 中文版_assertequeals

溴酸盐处理设备,矿泉水除溴成套树脂设备-程序员宅基地

文章浏览阅读144次。正常情况下,自然界的矿泉水中溴酸盐的含量几乎为零,但其富含矿物离子,如溴离子(Br-)就普遍存在。在使用臭氧对含有溴离子的矿泉水进行杀菌消毒时,溴离子容易与臭氧发生反应,被氧化成为溴酸盐,并以Br03-的形式存在于水中。 国际癌症研究中心针对“溴酸盐大军”之一的溴酸钾(KBrO3)做了相关实验,结果证实其对实验动物产生了致癌作用。就目前而言,还未发现对人体致癌。但过量摄入仍将危害人体健康。所以矿泉水中一定要去除溴酸盐。矿泉水工艺流程:原水→矿泉水水箱→源水增压泵→除铁锰过滤器→5μm过滤器→1μm精密过

关于数据库自增列使用的优缺点_数据库自增序列有什么不好的影响-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏3次。在平时的项目开发中,我相信有很大一批人都在用这个数据库自增ID,用数据库自增ID有利也有弊。优点:节省时间,根本不用考虑怎么来标识唯一记录,写程序也简单了,数据库帮我们维护着这一批ID号。缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况_数据库自增序列有什么不好的影响

nginx配置重启后新域名及其访问不起作用_为什么nginx配置两个server用ip访问不可以-程序员宅基地

文章浏览阅读4.5k次。1、nginx配置2个server后第一个域名1,访问第一个ip1:port1第二个域名2,访问第二个ip1:port22、重启nginx后,使用第一个域名访问正常。使用第二个域名访问时,访问的也是第一个服务,而非第二个。3、是nginx缓存引起的查找发现是,使用nginx -s stop后,真正的进程没有关闭重启后,也没报什么错,导致域名2访问不起作用。4、在任务管理..._为什么nginx配置两个server用ip访问不可以

部分安卓手机h5页面出现空白页面_oppo手机打开h5白屏-程序员宅基地

文章浏览阅读8k次。一 问题出现H5 页面上线后,部分用户反馈页面显示空白. 经问题排查页面空白的手机主要是vivo和oppo手机且andriod系统版本较低. 测试机显示空白的版本是andriod 5.1.1 版本.本项目是在jsp页面中引入的vue二 问题排查在浏览器中显示正常. 不会出现空白. 通过抓包工具发现抓取的文件用浏览器也会出现空白页面的,且没有报错信息.通过网上搜索和需求帮助, 定位到问题是..._oppo手机打开h5白屏

他们渲染了一百万个网页,来了解网络如何崩溃_程序员黑叔的博客-程序员宅基地

文章浏览阅读118次。最近在 medium 上看到这篇“比较新鲜的”文章 《We rendered a million web pages to learn how the web breaks》 觉着不错(..._如何让网络崩溃

随便推点

VC++对话框的任意扩展-程序员宅基地

文章浏览阅读350次。VC++对话框的任意扩展  我们在信息输入的时候,可能有很大的信息量,而这些信息又不是必须的,这时我们就需要给信息输入人员一个选择的接口。例如一个人事部门的职工信息录入系统就有这样的问题,其中的姓名、性别、年龄、政治面目、职务、学历、部门和联系电话是必须输入的信息,而婚姻

技术迭代|未来已来 HiBlock区块链全国线下沙龙启动!-程序员宅基地

文章浏览阅读163次。4月7日,清明假期的最后一天,HiBlock区块链社区在北京大恒科技大厦举办第一次区块链技术沙龙分享会,**从区块链研发从业者的职业发展和电子钱包开发技术两个角度展开了分享和讨论。**随着这一场技术沙龙活动的开启,HiBlock区块链社区全国线下沙龙活动也正式启动。2018年初,区块链技术进入了高速发展,似乎全国各地都在进行着关于区块链的讨论。对于HiBock来说,我们更关注区块链技术开发的升...

深入浅出Zabbix 3.0 -- 第七章 模板配置与管理-程序员宅基地

文章浏览阅读142次。第七章 模板配置与管理我们在主机中不仅可以添加很多需要监控的指标(即监控项),还可以添加图形、触发器、监控项组、展示屏、Web scenarios和low-level Discovery,如果在每个主机中添加这些对象,尤其是在一个大型环境中,其工作量是不可想象的,何况需要监控的主机有很多具有相同的监控属性,需要重复相同的配置工作,如果手工完成这些配置任务几乎是不可能的。好在...

Linux应用程序设置进程调度策略-程序员宅基地

文章浏览阅读2.7k次。在用户空间,调用sched_setscheduler()函数,函数原型如下:int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);参数说明:pid:

c++中冒号(:)和双冒号(::)的用法和c/c++ 位域结构体_c++一个冒号和两个冒号-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏10次。c++中冒号(:)和双冒号(::)的用法和c/c++ 位域结构体的说明和使用_c++一个冒号和两个冒号

sql时间格式化输出、Convert函数-程序员宅基地

文章浏览阅读702次。sql时间格式化输出、Convert函数