我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java数据库连接池DBCP的介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java数据库连接池DBCP的介绍

DBCP(Database connection pooling) 是 Apache 旗下 Commons 项目下的一个子项目,提供连接池功能;本文主要介绍 DBCP 的基本使用,文中使用到的软件版本:Java 1.8.0_191、DBCP 2.9.0、Spring Boot 2.3.12.RELEASE。

1、配置参数

参数 描述
username 用户名
password 密码
url 连接 url
driverClassName 驱动名称
connectionProperties

连接属性,格式为: [propertyName=property;]*
"user" and "password" 将被除外,所以在此不需要包含这两个属性。

参数 默认值 描述
 defaultAutoCommit  驱动的默认值  是否自动提交
 defaultReadOnly  驱动的默认值  是否只读
 defaultTransactionIsolation  驱动的默认值

默认的事务隔离级别
NONE、READ_COMMITTED、READ_UNCOMMITTED、
REPEATABLE_READ、SERIALIZABLE

 defaultCatalog  

默认的 catalog。(目录,类似于模式名,但比模式名更加抽象;
Oracle,MySQL 不支持,MS SQL Server = 数据库名)

 cacheState  true  是否缓存状态信息
 defaultQueryTimeout  null  默认查询时间
 enableAutoCommitOnReturn  true  连接归还到池时,是否设置为自动提交
 rollbackOnReturn  true

如果设置为 true,则连接归还到连接池时,
如果 auto commit=true 且 read-only=false,则会自动执行一次 rollback()。

 参数 默认值  描述
 initialSize  0 初始连接数
 maxTotal  8 最大连接数;负数表示没有限制
 maxIdle  8 最大空闲连接数,多余的空闲连接将被释放;负数表示没有限制
 minIdle  0 最小空闲连接数,如果不足则新的空闲连接将被创建。
 maxWaitMillis  indefinitely 从连接池获取连接,最大等待时间,超过该时间将抛出异常;-1 表示无限期
参数 默认值 描述
validationQuery  

连接池返回连接给调用者前用来校验的查询sql。
如果指定,则这个查询 SQL 必须至少返回一行数据;如果没有指定,则通过调用 isValid() 方法进行校验。

validationQueryTimeout no timeout 验证查询超时时间(秒)。如果设置为正数,那么通过 setQueryTimeOut()方法来设置查询的超时时间。
testOnCreate false 连接创建后,是否验证有效性
testOnBorrow true 从连接池获取连接时,是否验证有效性
testOnReturn false 连接返回连接池时,是否验证有效性
testWhileIdle false 连接空闲时,是否验证有效性;如果验证失败,则丢弃该连接。
timeBetweenEvictionRunsMillis -1 校验空闲连接的时间周期,非正表示不验证
numTestsPerEvictionRun 3 每次校验空闲连接的个数
minEvictableIdleTimeMillis 1000 * 60 * 30 空闲连接至少多长时间后,才会被校验
softMinEvictableIdleTimeMillis -1 空闲连接至少多长时间后,才会被校验;还需满足"空闲连接数>=minIdle"
maxConnLifetimeMillis -1 连接存活的最大时间;如果设置为非正数,则存活时间是无限的
logExpiredConnections true 过期的连接被连接池关闭时,是否写日志
connectionInitSqls null 连接第一次创建时,执行的初始化 SQL
lifo true true 表示获取连接时将返回最后返还连接池的连接(后进先出);false,则相反(先进先出)。
参数 默认值 描述
poolPreparedStatements false 预编译语句是否池化
maxOpenPreparedStatements unlimited 最大打开的预处理语句,负数表示没有限制
参数 默认值 描述
accessToUnderlyingConnectionAllowed false 是否允许访问底层连接

如果允许,可以使用下面的代码来访问底层连接:


Connection conn = ds.getConnection();

Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();

...

conn.close()
参数 默认值 描述
removeAbandonedOnMaintenance
removeAbandonedOnBorrow
 false

是否删除泄露的连接;如果超过一个活动连接未使用的时间超过 removeAbandonedTimeout,则是一个泄露的连接。
创建 Statement,PreparedStatement,CallableStatement 或使用这些对象执行一个查询都会重置连接的上传使用时间。
removeAbandonedOnMaintenance:空闲连接校验时是否回收泄露的连接,要使启用该设置需把 timeBetweenEvictionRunsMillis 设置为整数
removeAbandonedOnBorrow:从连接池获取连接时是否回收泄露的连接,要使启用该设置还需满足 'getNumActive() > getMaxTotal() - 3 and getNumIdle() < 2'

removeAbandonedTimeout  300  连接泄露的超时时间(秒)
logAbandoned false  连接删除时是否打印堆栈信息
abandonedUsageTracking false 如果设置为 true,数据库连接每执行一个方法都会打印堆栈信息
参数 默认值 描述
fastFailValidation false

是否快速失败验证;如果设置为 true,当发生致命异常时,不再执行 isValid(),也不去执行验证查询语句。致命的异常码有:
57P01 (ADMIN SHUTDOWN)
57P02 (CRASH SHUTDOWN)
57P03 (CANNOT CONNECT NOW)
01002 (SQL92 disconnect error)
JZ0C0 (Sybase disconnect error)
JZ0C1 (Sybase disconnect error)
Any SQL_STATE code that starts with "08"
要覆盖默认的异常代码,可以设置 disconnectionSqlCodes 属性。

disconnectionSqlCodes null 自定义异常代码
jmxName   注册连接池的 jmx 名称

详细的配置说明可参考官网文档:http://commons.apache.org/proper/commons-dbcp/configuration.html

2、使用

2.1、直接使用

2.1.1、引入依赖


<dependency>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-dbcp2</artifactId>

  <version>2.9.0</version>

</dependency>

2.1.2、使用例子


package com.abc.demo.general.dbpool;

import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class DBCPCase {

    public static void main(String[] args) {

        BasicDataSource basicDataSource = new BasicDataSource();

        basicDataSource.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");

        basicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        basicDataSource.setUsername("root");

        basicDataSource.setPassword("123456");

        basicDataSource.setMaxTotal(20);

        basicDataSource.setMinIdle(5);

        Connection connection = null;

        Statement st = null;

        ResultSet rs  = null;

        try {

            connection = basicDataSource.getConnection();

            st = connection.createStatement();

            rs = st.executeQuery("select version()");

            if (rs.next()) {

                System.out.println(rs.getString(1));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            close(connection);

        }

        try {

            //实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源。

            basicDataSource.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }



    private static void close(Connection connection) {

        if (connection != null) {

            try {

                connection.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

2.2、在 SpringBoot 中使用

2.2.1、引入依赖


<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.3.12.RELEASE</version>

    <relativePath />

</parent>

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

    </dependency>

    <dependency>

        <groupId>org.apache.commons</groupId>

        <artifactId>commons-dbcp2</artifactId>

        <version>2.9.0</version>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

    </dependency>

</dependencies>

2.2.2、单数据源

application.yml 配置:


spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8

    username: root

    password: 123456

    type: org.apache.commons.dbcp2.BasicDataSource

    dbcp2:

      max-total: 20

      max-idle: 5

使用:


@Autowired

private DataSource dataSource;

2.2.3、多数据源

application.yml 配置:


spring:

  datasource:

    dbcp2:

      db1:

        driver-class-name: com.mysql.cj.jdbc.Driver

        url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8

        username: root

        password: 123456

        max-total: 20

        max-idle: 5

      db2:

        driver-class-name: com.mysql.cj.jdbc.Driver

        url: jdbc:mysql://10.40.9.12:3306/myDb?useUnicode=true&characterEncoding=UTF-8

        username: root

        password: 123456

        max-total: 20

        max-idle: 5

数据源配置类:


package com.abc.demo.config;

import org.apache.commons.dbcp2.BasicDataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.jdbc.DataSourceBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;



import javax.sql.DataSource;



@Configuration

public class DataSourceConfig {

    @Bean("dataSource1")

    @ConfigurationProperties(prefix = "spring.datasource.dbcp2.db1")

    public DataSource dataSource1() {

        return DataSourceBuilder.create().type(BasicDataSource.class).build();

    }

    @Bean("dataSource2")

    @ConfigurationProperties(prefix = "spring.datasource.dbcp2.db2")

    public DataSource dataSource2() {

        return DataSourceBuilder.create().type(BasicDataSource.class).build();

    }

}

使用:


@Autowired

@Qualifier("dataSource1")

private DataSource dataSource1;

@Autowired

@Qualifier("dataSource2")

private DataSource dataSource2;

到此这篇关于 Java 数据库连接池 DBCP 的介绍的文章就介绍到这了,更多相关 Java  连接池 DBCP内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java数据库连接池DBCP的介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaJDBCAPI介绍与实现数据库连接池流程

JDBC是指Java数据库连接,是一种标准Java应用编程接口(JAVAAPI),用来连接Java编程语言和广泛的数据库。从根本上来说,JDBC是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,本篇文章我们来了解JDBCAPI及数据库连接池
2022-12-08

Java数据库连接池之DBCP浅析_动力节点Java学院整理

一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体
2023-05-31

Java操作数据库——使用连接池连接数据库

传统方式和连接池方式传统方式的步骤使用传统方式在Java中使用JDBC连接数据库,完成一次数据库的操作,一般有以下几个步骤:1. 加载驱动。2. 建立连接。3. 执行SQL语句。4. 释放连接。5. 传统方式的弊端每一次对数据库的操作都要建立一次连接,并且会将
Java操作数据库——使用连接池连接数据库
2014-08-26

DataSource与数据库连接池简介(JDBC简介)

DataSource是作为DriverManager的替代品而推出的,DataSource对象是获取连接的首选方法,这篇文章主要介绍了DataSource与数据库连接池简介(JDBC简介),需要的朋友可以参考下
2022-11-13

Java数据库连接池(经典)

转载自:http://langzixin.iteye.com/blog/808975不错的案例,收藏起来,要不时间长了就找不到了
2023-06-03

Node连接mysql数据库方法介绍

使用Node做Web开发,基本上都是使用NoSQL数据库,最频繁的就是使用MongoDB了,自己做了一些简单的Web开发,为了降低学习门槛,一直使用MySQL来做数据库。这里简单介绍一下连接MySQL数据库的方式,希望能帮助到其他人。npm
2022-06-04

DBUtils数据库连接池

使用数据库连接池技术,可以重复使用多个数据库连接,避免每次执行数据库操作都建立连接和关闭连接,也避免了大型应用同时占用多个数据库连接。以连接mysql为例import pymysqlfrom DBUtils.PooledDB import
2023-01-31

java数据库连接池如何实现

Java数据库连接池可以通过以下步骤实现:1. 导入相应的依赖库:你需要导入数据库驱动程序和连接池的相关依赖库。一般来说,你需要使用特定数据库供应商提供的JDBC驱动程序,并选择一个连接池实现(如Apache Commons DBCP、Hi
2023-09-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录