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

Java数据库连接池c3p0介绍

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Java数据库连接池c3p0介绍

前言:

c3p0 是一个开源的数据库连接池,实现了 JDBC 3 规范;本文主要介绍 c3p0 的基本使用,文中使用到的软件版本:Java 1.8.0_191、c3p0 0.9.5.5、Spring Boot 2.3.12.RELEASE。

1、配置参数

1.1、基础配置

配置

参数 默认值 描述
driverClass null 驱动类名称
jdbcUrl null jdbc 连接 url
user null 用户名
password null 密码

1.2、连接池大小

参数 默认值 描述
acquireIncrement 3 连接池中的连接耗尽时,一次创建的连接个数
initialPoolSize 3 初始连接池大小,介于 minPoolSize 和 maxPoolSize 之间
maxPoolSize 15 最大连接数
minPoolSize 3 最小连接数

1.3、连接池大小和连接存活时间

参数 默认值 描述
maxConnectionAge 0 连接存活的最长时间(秒),0 表示没有限制。正在使用的连接不会不受此限制。
 maxIdleTime 0  空闲连接数最大存活时间,0 表示永不过期
 maxIdleTimeExcessConnections 0  当连接数大于 minPoolSize 时,空闲连接数最大存活时间,0 表示永不过期

1.4、连接测试

参数 默认值 描述
automaticTestTable null 测试的表名;如果设置了,c3p0 将使用该表名创建一个空表,并使用其来测试连接,preferredTestQuery 参数将被忽略。
connectionTesterClassName com.mchange.v2.c3p0.impl.DefaultConnectionTester 连接测试的类名,需实现  com.mchange.v2.c3p0.ConnectionTester 或 com.mchange.v2.c3p0.QueryConnectionTester 接口。
idleConnectionTestPeriod 0 空闲连接测试的间隔(秒)。
preferredTestQuery null 连接测试的语句;如果不设置,将使用 DatabaseMetaData 的 getTables 方法来测试,这可能时比较慢的。
testConnectionOnCheckin false 连接返回连接池时,是否测试
testConnectionOnCheckout false 从连接池获取连接时,是否测试

1.5、预编译池

参数 默认值 描述
maxStatements 0 缓存总体预编译语句的最大数量
maxStatementsPerConnection 0 缓存每个连接中预编译语句的最大数量
statementCacheNumDeferredCloseThreads 0 清理 statement 缓存的线程数,如果需要设置,应设置为 1。一些数据库,特别是 oracle 会在连接使用时关闭 statement,数据库无法很好的处理这种情况,进而导致死锁。清理的线程会在连接

maxStatements 和 maxStatementsPerConnection 如果都为 0,将不缓存预编译语句。如果 maxStatements=0 and maxStatementsPerConnection>0maxStatementsPerConnection 起作用,不限制总的缓存数量;如果 maxStatements>0 and maxStatementsPerConnection=0maxStatements 起作用,不限单个连接的缓存数量。

1.6、数据库中断的恢复

参数 默认值 描述
acquireRetryAttempts 30 获取连接失败时的重试次数
acquireRetryDelay 1000 连接获取重试的时间间隔(毫秒)
 breakAfterAcquireFailure  false 尝试获取连接失败时,是否声明连接池断开并永久关闭

1.7、自定义连接生命周期管理

参数 默认值 描述
connectionCustomizerClassName null 连接生命周期管理的自定义类,需实现 com.mchange.v2.c3p0.ConnectionCustomizer 接口

1.8、处理未提交的事务

参数 默认值 描述
autoCommitOnClose false 连接在返回连接池时是否自动提交事务。true,提交事务;false,回滚事务
forceIgnoreUnresolvedTransactions false 连接在返回连接池时,是否强制不处理事务;强烈不推荐设置为 true。

1.9、调试

参数 默认值 描述
debugUnreturnedConnectionStackTraces false 是否记录活动连接的堆栈信息;如果设为 true,且 unreturnedConnectionTimeout>0,当连接借出时间 > unreturnedConnectionTimeout 时,就会打印连接的堆栈信息,并删除该连接。
unreturnedConnectionTimeout 0 连接未返回连接池的超时时间(秒)

这两个参数可用于帮助发现连接泄露。

1.10、避免热部署内存泄露

参数 默认值 描述
contextClassLoaderSource caller 用于生成 c3p0 线程的类加载器来源,为 caller, library 或 none。caller 表示来源于连接池的调用者;library 表示来源于 c3p0 本身;none 表示使用系统类加载器
privilegeSpawnedThreads false  生成 c3p0 线程时是否使用 c3p0 库中的 AccessControlContext;默认(false)使用连接池调用者的 AccessControlContext。

在应用热部署、取消部署时,连接池可能会阻止垃圾回收进而导致内存泄露; 这两个参数主要用于处理这种情况。

1.11、其它配置

参数 默认值 描述
checkoutTimeout 0 从连接获取连接的超时时间,0 表示永不超时
factoryClassLocation null c3p0 libraries的路径,如果在本地(通常都是这样),那么无需设置
forceSynchronousCheckins false 连接返回连接池是否同步方式
 maxAdministrativeTaskTime  0  管理任务运行的最大时间(秒),超过改时间会终端任务;0 表示管理任务永远不被打断。
 numHelperThreads  3  管理线程个数
usesTraditionalReflectiveProxies false 已过期。是否使用发射动态代理的方式来实现 Connection 及 其他 JDBC 接口。

详细说明可参考官网文档:https://www.mchange.com/projects/c3p0/#configuration

2、原始连接操作

c3p0 提供 api 来访问原始连接中的非标准接口:

  • 把连接转成 C3P0ProxyConnection
  • 然后调用 rawConnectionOperation 方法

下面是获取 PostgreSQL  JDBC 驱动中 CopyManager 对象的方法:

Connection connection = (C3P0ProxyConnection) c3p0DataSource.getConnection();

C3P0ProxyConnection castConnection = (C3P0ProxyConnection) connection;

Method method = BaseConnection.class.getMethod("getCopyAPI", new Class[]{});

CopyManager copyManager = (CopyManager) castConnection.rawConnectionOperation(method, C3P0ProxyConnection.RAW_CONNECTION, new Object[]{});

3、使用

3.1、直接使用

3.1.1、引入依赖


<dependency>

    <groupId>com.mchange</groupId>

    <artifactId>c3p0</artifactId>

    <version>0.9.5.5</version>

</dependency>

3.1.2、使用例子


package com.abc.demo.general.dbpool;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class C3p0Case {

    public static void main(String[] args) throws PropertyVetoException {

        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

        comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");

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

        comboPooledDataSource.setUser("root");

        comboPooledDataSource.setPassword("123456");

        comboPooledDataSource.setInitialPoolSize(2);

        comboPooledDataSource.setMinPoolSize(2);

        comboPooledDataSource.setMaxPoolSize(10);

        comboPooledDataSource.setPreferredTestQuery("select 1");

        comboPooledDataSource.setIdleConnectionTestPeriod(60);

        comboPooledDataSource.setTestConnectionOnCheckout(true);

        comboPooledDataSource.setCheckoutTimeout(1000 * 30);

        Connection connection = null;

        Statement st = null;

        ResultSet rs  = null;

        try {

            connection = comboPooledDataSource.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);

        }

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

        comboPooledDataSource.close();

    }

    private static void close(Connection connection) {

        if (connection != null) {

            try {

                connection.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

3.2、在 SpringBoot 中使用

3.1.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>com.mchange</groupId>

        <artifactId>c3p0</artifactId>

        <version>0.9.5.5</version>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

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

    </dependency>

</dependencies>

3.1.2、单数据源

application.yml 配置:


spring:

  datasource:

    c3p0:

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

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

      user: root

      password: 123456

      initial-pool-size: 2

      min-pool-size: 2

      max-pool-size: 10

      preferred-test-query: select 1

      idle-connection-test-period: 60

      test-connection-on-checkout: true

      checkout-timeout: 30000

数据源配置类:


package com.abc.demo.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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("dataSource")

    @ConfigurationProperties(prefix = "spring.datasource.c3p0")

    public DataSource dataSource1() {

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

    }

}

使用:


@Autowired

private DataSource dataSource;

3.1.3、多数据源

application.yml 配置:


spring:

  datasource:

    c3p0:

      db1:

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

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

        user: root

        password: InsYR0ot187!

        initial-pool-size: 2

        min-pool-size: 2

        max-pool-size: 10

        preferred-test-query: select 1

        idle-connection-test-period: 60

        test-connection-on-checkout: true

        checkout-timeout: 30000

      db2:

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

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

        user: root

        password: InsYR0ot187!

        initial-pool-size: 2

        min-pool-size: 2

        max-pool-size: 10

        preferred-test-query: select 1

        idle-connection-test-period: 60

        test-connection-on-checkout: true

        checkout-timeout: 30000

数据源配置类:


package com.abc.demo.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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.c3p0.db1")

    public DataSource dataSource1() {

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

    }

    @Bean("dataSource2")

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

    public DataSource dataSource2() {

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

    }

}

使用:


@Autowired

@Qualifier("dataSource1")

private DataSource dataSource1;



@Autowired

@Qualifier("dataSource2")

private DataSource dataSource2;

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

免责声明:

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

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

Java数据库连接池c3p0介绍

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

下载Word文档

猜你喜欢

2020.05.28 数据库连接池 C3P0 Druid JDBCTemplate

今日内容1. 数据库连接池2. Spring JDBC : JDBC Template数据库连接池1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接
2020.05.28 数据库连接池 C3P0 Druid  JDBCTemplate
2018-09-05

c3p0数据库连接池配置总结

C3P0是一个开源的数据库连接池,可以用于在Java应用程序中管理数据库连接。下面是C3P0数据库连接池的配置总结:1. 配置数据源:```javaComboPooledDataSource dataSource = new ComboPo
2023-10-12

c3p0数据库连接池如何在Java项目中使用

今天就跟大家聊聊有关c3p0数据库连接池如何在Java项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。c3p0是什么c3p0的出现,是为了大大提高应用程序和数据库之间访问效率
2023-05-31

c3p0数据库连接池如何进行配置

这篇文章将为大家详细讲解有关c3p0数据库连接池如何进行配置,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。c3p0的配置方式分为三种,分别是1.setters一个个地设置各个配置项2.类路径
2023-05-31

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

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

详解springboot 使用c3p0数据库连接池的方法

使用springboot开发时,默认使用内置的tomcat数据库连接池,经常碰到这种情况:运行时间一长,数据库连接中断了。所以使用c3p0连接池吧。引入的maven依赖: c3p0
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

编程热搜

  • 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动态编译

目录