Java 数据库连接池c3p0 介绍

目录
  • 1、配置参数
    • 1.1、基础配置
    • 1.2、连接池大小
    • 1.3、连接池大小和连接存活时间
    • 1.4、连接测试
    • 1.5、预编译池
    • 1.6、数据库中断的恢复
    • 1.7、自定义连接生命周期管理
    • 1.8、处理未提交的事务
    • 1.9、调试
    • 1.10、避免热部署内存泄露
    • 1.11、其它配置
  • 2、原始连接操作
  • 3、使用
    • 3.1、直接使用
      • 3.1.1、引入依赖
      • 3.1.2、使用例子
    • 3.2、在 SpringBoot 中使用
      • 3.1.1、引入依赖
      • 3.1.2、单数据源
      • 3.1.3、多数据源

前言:

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 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Eclipse开发JavaWeb项目配置Tomcat的方法步骤

    以下都经过本人自学时一一自己动手配置实验. 首先介绍eclipse开发JavaWeb项目需要配置的相关环境,使用tomcat软件在本地搭建服务器,然后再在eclipse环境下配置tomcat: 第一步:使用tomcat软件在本地搭建服务器 这个本地的tomcat服务器与eclipse环境下配置tomcat服务器都可以使用,但是只能启动一个,否则会报端口冲突,到时安装好环境会介绍 tomcat软件是apache旗下的一个开源项目.软件下载链接:http://tomcat.apache.org/,如

  • Java 数据库连接池DBPool 介绍

    目录 1.配置参数 2.使用 2.1.直接使用 2.1.1.引入依赖 2.1.2.使用例子 2.2.在 SpringBoot 中使用 2.1.1.引入依赖 2.1.2.单数据源 2.1.3.多数据源 前言: DBPool 是一个高效易配置的数据库连接池,支持 JDBC 4.2,但目前已经不维护了:本文简单介绍下 DBPool 的使用,文中使用到的软件版本:Java 1.8.0_191.DBPool 7.0.1.Spring Boot 2.3.12.RELEASE. 1.配置参数 参数 描述 na

  • Java 数据库连接池 DBCP 的介绍

    目录 1.配置参数 2.使用 2.1.直接使用 2.1.1.引入依赖 2.1.2.使用例子 2.2.在 SpringBoot 中使用 2.2.1.引入依赖 2.2.2.单数据源 2.2.3.多数据源 DBCP(Database connection pooling) 是 Apache 旗下 Commons 项目下的一个子项目,提供连接池功能:本文主要介绍 DBCP 的基本使用,文中使用到的软件版本:Java 1.8.0_191.DBCP 2.9.0.Spring Boot 2.3.12.RELE

  • Java 数据库连接池 Tomcat介绍

    目录 1.配置参数 1.1.基础配置 1.2.系统属性 1.3.一般参数 1.4.增强参数 2.使用 2.1.直接使用 2.1.1.引入依赖 2.1.2.使用例子 2.2.作为资源配置在 Tomcat 中 3.2.在 SpringBoot 中使用 3.1.1.引入依赖 3.1.2.单数据源 3.1.3.多数据源 前言: Tomcat 连接池是从 Tomcat 7 开始重新编写的高并发连接池,用以取代以前 Tomcat 中使用的 DBCP 1 连接池,它可以配置在 Tomcat 中使用,也可以单独

  • 没有编辑器的环境下是如何创建Servlet(Tomcat+Java)项目的?

    简介 巨坑,有时候没有编辑器时,启动一个Servlet巨麻烦,在此做个记录 # 配置环境变量 Java修改环境变量就不演示了,下面记录的是添加servlet-api到环境变量中 1.找到tomat目录,打开tomcat目录下的lib目录,记住servlet-api.jar中的路径 2.添加系统环境变量,注意classpath小写(有一次我写大写servlet怎么都启动不起来,emmm) classpath 创建web目录 找到tomat目录下的webapps文件,此目录为tomcat的web项目

  • JavaWeb 入门篇:创建Web项目,Idea配置tomcat

    目录 创建一个maven项目 项目结构 添加框架 在pom.xml 中添加如下依赖 配置tomcat 添加完如下图: 解决导入包问题: 启动测试: 总结 创建一个maven项目 项目结构 添加框架 在pom.xml 中添加如下依赖 dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <versi

  • Java tomcat中的类加载器和安全机制你了解吗

    目录 类加载器 双亲委派 URLClassLoader Tomcat中类加载器架构 安全机制 总结 类加载器 java中的类并不是一次加载完成的,而是按需加载.类加载器是用于加载java类到java虚拟机中的组件,它负责读取java字节码,并转换成 java.lang.Class 的一个实例,使字节码.class文件可以运行.一般类加载器负责根据一个指定的类找到对应的字节码,然后根据这些字节码定义一个java类.另外,它还可以加载资源,包括图像文件和配置文件. 类加载器可以使java类动态地加载

  • Java 后端开发中Tomcat服务器运行不了的五种解决方案

    目录 方法一 方法二 方法三 方法四 方法五 方法一 查看Servers项目是否被关闭或者被删除,Servers是tomcat部署环境的配置项目,我们自己的项目能不能部署在Tomcat服务器上,Servers至关重要.观察该项目是否出于打开的状态: 方法二 查看Servers组件中的tomcat服务器中是否存在太多的被运行执行过的项目,如果存在,需要删除一些不再需要被运行的项目,保留当前需要运行的某个项目即可,因为保留太多的项目会增加tomcat服务器的运行时检索的压力,拖慢运行时间,如果其他项

  • Java 数据库连接池c3p0 介绍

    目录 1.配置参数 1.1.基础配置 1.2.连接池大小 1.3.连接池大小和连接存活时间 1.4.连接测试 1.5.预编译池 1.6.数据库中断的恢复 1.7.自定义连接生命周期管理 1.8.处理未提交的事务 1.9.调试 1.10.避免热部署内存泄露 1.11.其它配置 2.原始连接操作 3.使用 3.1.直接使用 3.1.1.引入依赖 3.1.2.使用例子 3.2.在 SpringBoot 中使用 3.1.1.引入依赖 3.1.2.单数据源 3.1.3.多数据源 前言: c3p0 是一个开

  • Java数据库连接池c3p0过程解析

    首先下载c3p0的jar包 https://mvnrepository.com/search?q=c3p0 导入jar包到eclipse 将c3p0的jar包放到eclipse中,单击右键,选择build path ,在选择 add jars 创建连接池对象 ComboPooledDataSource cpd= new ComboPooledDataSource(); 设置连接参数 方法一 使用静态代码块来初始化参数(不推荐)如果数据库发生改变,源文件需要重新编写编译,项目需要重新部署 stat

  • Java 数据库连接池Druid 的介绍

    目录 1.配置参数 2.使用 2.1.直接使用 2.1.1.引入依赖 2.1.2.使用例子 2.2.在 SpringBoot 中使用 2.1.1.引入依赖 2.1.2.单数据源 2.1.3.多数据源 2.1.4.开启监控功能 前言: Druid 连接池是阿里巴巴开源的数据库连接池项目,Druid 为监控而生,内置强大的监控功能,监控特性不影响性能,官网地址为:https://github.com/alibaba/druid/wiki/,本文主要介绍 Druid 的基本使用,文中使用到的软件版本:

  • Java 数据库连接池详解及简单实例

    Java 数据库连接池详解 数据库连接池的原理是: 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用.而连接的建立.断开都由连接池自身来管理.同时,还可以通过设置连接池的参数来控制连接池中的初始连接数.连接的上下限数以及每个连接的最大使用次数.最大空闲时间等等.也可以通过其自身的管理机制来监视数据库连接的

  • Java数据库连接池的几种配置方法(以MySQL数据库为例)

    一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1.方法一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,如下: <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/chaoshi" auth="

  • Java数据库连接池之proxool_动力节点Java学院整理

    Proxool是一种Java数据库连接池技术.sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况. 目前是和DBCP以及C3P0一起,最为常见的三种JDBC连接池技术. 日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0. 下面通过一个Demo说明一下如何使用: 项目结构如下: DBLink.Java文件中的代码: package com.bjpowe

  • 详解Java数据库连接池

    一.什么是数据库连接池 就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理. 二.为什么需要连接池,好处是什么? 1.节省资源,如果每次访问数据库都创建新的连接,创建和销毁都浪费系统资源 2.响应性更好,省去了创建的时间,响应性更好. 3.统一管理数据库连接,避免因为业务的膨胀导致数据库连接的无限增多. 4.便于监控. 三.都有哪些连接池方案 数据库连接池的方案有不少,我接触过的连接池方案有: 1.C3p0 这个连接池我很久之前看到

随机推荐