JDBC p5 数据库连接池

这篇具有很好参考价值的文章主要介绍了JDBC p5 数据库连接池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库连接池

传统获取Connection问题分析

  1. 传统的JDBC数据库使用 DriverManager 来获取, 每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证IP地址,用户名和密码(0.05 ~ 1 s 时间)。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
  2. 每一次数据库连接使用后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
  3. 传统获取连接的方式,不能控制创建的连接数量,如果连接过多,也可能导致内存泄露,MySQL崩溃。
  4. 解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

案例:

package com.hspedu.jdbc.datasource;

import com.hspedu.jdbc.utils.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;

public class ConQuestion {

    //代码 连接mysql 5000次
    @Test
    public void testCon(){
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++){
            //使用传统jdbc连接方式
            Connection connection = JDBCUtils.getConnection();

            //可能会抛出too many connections的异常

            //再看看,如果得到连接就立即关闭,总共会耗时多久
            JDBCUtils.close(null, null, connection);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时 = " + (end - start));//耗时 = 6598
    }
}

数据库连接池原理

  • 基本介绍

    1. 预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕之后再放回去(放回连接,其实就是指程序不再引用这个连接)。
    2. 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
    3. 当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

    原理示意图:

    JDBC p5 数据库连接池

    JDBC p5 数据库连接池

常用的数据库连接池

​ JDBC 的数据库连接池使用 javax.sql.DateSource 来表示,DataSource 只是一个接口,该接口通常由第三方提供实现。

数据库连接池种类:**

  1. C3P0 数据库连接池:速度相对较慢,稳定性不错 (hibernate,spring);
  2. DBCP 数据库连接池:速度相对C3P0较快,但不稳定;
  3. Proxool 数据库连接池:有监控连接池状态的功能,稳定性较C3P0差一点;
  4. BoneCP 数据库连接池:速度快;
  5. Druid(德鲁伊) 数据库连接池:是阿里提供的数据库连接池,集DBCP、C3P0、Proxool优点于一身的数据库连接池;

C3P0的使用

需要自行导入相关的jar包。

  1. 方式1:相关参数,在程序中指定user,url, password。
  2. 方式2: 使用配置文件的模板来完成。

代码演示:

package com.hspedu.jdbc.datasource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class C3P0_ {

    //方式1:相关参数,在程序中指定user, url, password
    @Test
    public void testC3P0_01() throws IOException, PropertyVetoException, SQLException {

        //1. 创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

        //2. 通过配置文件获取相关连接信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        //给数据源(数据源负责连接,连接池) comboPooledDataSource 设置参数
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);

        //设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(10);

        //最大连接数
        comboPooledDataSource.setMaxPoolSize(50);

        //获取连接
        //测试连接池的效率,连接5000次
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();//这个方法就是从DateSource接口实现的
//            System.out.println("连接OK");

            //关闭
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("c3p0 5000次连接mysql 耗时 = " + (end - start));//c3p0 5000次连接mysql 耗时 = 280,之前传统的耗时 = 6598
    }


    //第二种方式, 使用配置文件的模板来完成
    //1. 将c3p0 提供的 c3p0.config.xml 拷贝到src目录
    //2. 该文件指定了连接数据库和连接池的相关参数
    @Test
    public void testC3P0_02() throws SQLException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hsp_edu");//填入数据源名称

        long start = System.currentTimeMillis();
        for (int i = 0; i < 500000; i++) {
            Connection connection = comboPooledDataSource.getConnection();//这个方法就是从DateSource接口实现的
//            System.out.println("连接OK");

            //关闭
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("c3p0 第二种方式500000次连接mysql 耗时 = " + (end - start));//c3p0 第二种方式500000次连接mysql 耗时 = 1452

    }
}

配置文件 c3p0-config.xml:

<c3p0-config>
        <named-config name="hsp_edu">
            <!--  连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_learning</property>
            <property name="user">root</property>
            <property name="password">root</property>

            <!-- 连接池参数 -->
            <!-- 每次增长的连接数 -->
            <property name="acquireIncrement">5</property>
            <!-- 初始的连接数 -->
            <property name="initialPoolSize">5</property>
            <!-- 最大连接数 -->
            <property name="maxPoolSize">10</property>
            <!-- 最小连接数 -->
            <property name="minPoolSize">5</property>
            <!-- 每个连接对象可连接的最多的命令对象数 -->
            <property name="maxStatementPerConnection">2</property>
        </named-config>
</c3p0-config>

Druid(德鲁伊)的使用

需要自行导入相关的jar包。

代码演示:

package com.hspedu.jdbc.datasource;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.jupiter.api.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class Druid_ {

    @Test
    public void testDruid() throws Exception {
        //1. 加入 Druid jar包
        //2. 加入 配置文件 druid.properties,将该文件拷贝到项目的src目录
        //3. 创建 Properties 对象
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\druid.properties"));

        //4. 创建一个指定参数的数据库连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        long start = System.currentTimeMillis();
        for (int i = 0; i < 500000; i++) {
            Connection connection = dataSource.getConnection();
//            System.out.println("连接成功");
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("druid连接池, 连接500000次 耗时 = " + (end - start));//druid连接池, 连接500000次 耗时 = 549

    }
}

配置文件 druid.properties:文章来源地址https://www.toymoban.com/news/detail-618381.html

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc_learning?rewriteBatchedStatements=true
username=root
password=root
#initial connection size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000

到了这里,关于JDBC p5 数据库连接池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 进阶篇】JDBC Connection详解:连接到数据库的关键

    在Java中,要与数据库进行交互,需要使用Java数据库连接(JDBC)。JDBC允许您连接到不同类型的数据库,并执行SQL查询、插入、更新和删除操作。在JDBC中,连接数据库是一个重要的步骤,而 Connection 对象是实现这一目标的关键。本篇博客将详细解释 Connection 对象的作用、创建

    2024年02月05日
    浏览(31)
  • 数据库设计、JDBC、数据库连接池

    数据库设计概念 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。 建立数据库中的表结构以及表与表之间的关联关系的过程。 有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤 需求分析(数据是

    2024年02月19日
    浏览(41)
  • JDBC连接数据库

    目录 一、JDBC概念 1.1Java操作数据库的流程 1.2编写代码步骤 1.3具体操作 二、JDBC API详解 2.1 DriverManager(驱动管理类) 作用 2.2 Connection(数据库连接对象)作用: 2.3 Statement   2.4 ResultSet (结果对象集)作用 2.5 PreparedStatement  三、数据库连接池实现 JDBC 就是使用 Java语言操作关系型

    2024年02月05日
    浏览(43)
  • JDBC数据库连接

    目录 引言  一,基本概念 二,常用操作步骤 三,连接操作         JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种 关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建 更高级的工具

    2024年02月13日
    浏览(35)
  • JDBC入门数据库连接

    JDBC(Java Database Connectivity)是Java程序与数据库进行交互的一种标准接口,它提供了一种简单的方式来连接和操作数据库。在使用JDBC之前,需要先了解以下几个概念: JDBC Driver :JDBC驱动程序是一个Java类,用于将Java应用程序与特定数据库管理系统(DBMS)连接。JDBC驱动程序分

    2023年04月25日
    浏览(37)
  • 数据库——JDBC基本连接步骤

    目录 JDBC概念: JDBC保姆级连接步骤: JDBC连接中用到的对象详解: 1.DriverManager对象(驱动管理对象) 2.Connection对象(连接对象) 3.Statement对象(执行SQL语句的对象) 4.ResultSte对象(结果集) JDBC的全称是:Java数据库连接(Java DataBase Connectivity),它是一套用于执行SQL语句的Jav

    2024年02月07日
    浏览(47)
  • 通过JDBC连接数据库并用Java把数据写入数据库

    目录 1.新建项目 2.在src包下新建lib包,用来存放jar包(下载对应jar包复制到lib包里) 3.右键导入的jar包,找到并单击\\\"添加到库\\\"(add....) 4.在src包下新建bean包,新建class类 5.class类中写数据库表中对应的列名的set get方法、空参、有参(String方法)注意:类名为私有类(private),新建类时数

    2024年02月02日
    浏览(47)
  • MySQL数据库,JDBC连接数据库操作流程详细介绍

    在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。 目录 1. 啥是JDBC? 2. JDBC依赖包 2.1 依赖包

    2024年02月06日
    浏览(78)
  • eclipse使用jdbc连接数据库

    下载和mysql对应版本的jar包。 我的mysql下载的8.0.13版本的,所以下载8.0.13的jar包。官网下载地址: https://dev.mysql.com/downloads/connector/j/?os=26 (如果需要下载历史版本,点击 archievs) 下载之后,解压目录,获得jar包。 导入jarb包。 第一步:在eclipse中新建工程JDBC,建立一个lib目录

    2024年02月11日
    浏览(40)
  • JAVA连接数据库 JDBC编程

    提供修改数据库和查询数据库的代码,两者只有很细微的差别         注意在进行连接数据库首先你得下载你对应MYSQL版本的JDBC驱动包,比如MYSQL8.0版本的你就要下载MYSQL8.0版本的JDBC驱动包,MYSQL5.1版本的你就要下载MYSQL5.1版本的JDBC驱动包 我下载的8.0版本的驱动包就是这个

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包