数据库连接池之C3P0连接池(mysql)

5 篇文章 0 订阅
5 篇文章 0 订阅

数据库连接池之C3P0连接池(mysql)

本仙鱼又更博了,我是勤劳的小蜜蜂嗡嗡嗡~~

1 C3P0简介

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

在开始之前,我们先看一下C3P0和DBCP的区别:
1.dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能

​ 2.dbcp需要手动加载配置文件,c3p0自动加载配置文件

好,接下来也是本仙鱼手把手带你来认识C3P0~

2 使用步骤

2.1 创建项目

本仙使用的是IDEA,个人觉得创建项目常规操作,略过.

2.2 导入相关的jar包:

导入如下两个jar包:c3p0-0.9.1.2.jar

​ mchange-commons-java-0.2.11.jar

​ mysql-connector-java-5.1.41.jar

本篇博客中不再进行数据库增删改查的操作,mysql-connector-java-5.1.41.jar可以不加,因为习惯问题,我加上了~哈哈.

如果你没有这几个jar包的话:点击进入下载传送门

C3P0所需要的jar包

想要去使用C3P0那我们就要对它的属性们进行一个初始化的设置,本篇博客中只举简单的例子,不再进行数据库增删改查的操作,**数据库连接池之自定义连接池**中有相关的操作,可以去那里查看呦.

2.3 C3P0初始化

先放一句很有魔性的话:

初始化C3P0连接池,如果没有配置文件(.xml,.properties),就自己设置,有配置文件自动加载.

2.3.1 通过硬编码初始化C3P0

通过硬编码直接初始化C3P0:就是在没有配置文件的情况下,手动在静态代码块中将要使用的属性(只列举部分)直接进行初始化赋值操作:

public class C3P0 {
    //C3P0使用的是ComboPooledDataSource类
    public static ComboPooledDataSource dataSource;

    //初始化C3P0
    static {
        try {
            //1.初始化C3P0连接池(有xml配置文件会自动加载)
            dataSource = new ComboPooledDataSource();
            //四个基本属性
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
            dataSource.setUser("root");
            dataSource.setPassword("123456789");
            //其他属性
            //初始大小
            dataSource.setInitialPoolSize(10);
            //最大大小
            dataSource.setMaxPoolSize(50);
            //最小大小
            dataSource.setMinPoolSize(10);
            //连接池中连接不够时,每次增长个数
            dataSource.setAcquireIncrement(5);
            //检查时间
            dataSource.setCheckoutTimeout(5000);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
    }
}
2.3.2 通过自动加载配置文件初始化DBCP

配置文件有两种方式:

1 .xml文件
2 .properties文件

如果xml配置文件和属性文件都存在时,xml优先级高于属性文件

有配置文件时,C3P0会自动加载配置文件完成初始化,所以我们给出配置文件就可以了

2.3.2.1 c3p0-config.xml

必须是c3p0-config.xml,不能改,不然自动加载的时候找不到配置文件!

必须是c3p0-config.xml,不能改,不然自动加载的时候找不到配置文件!

必须是c3p0-config.xml,不能改,不然自动加载的时候找不到配置文件!

重要的事情讲三遍,我就犯了这个错误~~嘿嘿~

使用.xml配置文件有一个好处就是可以配置多个数据库, 包含命名配置文件默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <!-- 基本配置 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydatabase</property>
        <property name="user">root</property>
        <property name="password">123456789</property>
        <!--扩展配置-->
        <!-- 连接超过10秒报错-->
        <property name="checkoutTimeout">10000</property>
        <!--30秒检查空闲连接 -->
        <property name="idleConnectionTestPeriod">30</property>
        <!-- 初始大小 -->
        <property name="initialPoolSize">10</property>
        <!-- 每次增长的个数 -->
        <property name="acquireIncrement">5</property>
        <!-- 30秒不适用丢弃-->
        <property name="maxIdleTime">20</property>
        <property name="maxPoolSize">50</property>
        <property name="minPoolSize">5</property>
    </default-config>
    <!-- 命名的配置 -->
    <named-config name="database">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/database</property>
        <property name="user">root</property>
        <property name="password">123456789</property>
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">20</property>
        <property name="minPoolSize">10</property>
        <property name="maxPoolSize">40</property>
    </named-config>
</c3p0-config>

调用命名配置文件:

public class C3P0 {
    //C3P0使用的是ComboPooledDataSource类
    public static ComboPooledDataSource dataSource;

    //初始化C3P0
    static {
        //1.加载默认配置文件
		dataSource = new ComboPooledDataSource();
        //2.加载命名配置文件
        dataSource = new ComboPooledDataSource("database");
    }
}
2.3.2.2 c3p0.properties

c3p0.properties(必须加出c3p0这个前缀,避免属性被使用时发生异常)

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/mydatabase
c3p0.user=root
c3p0.password=123456789
c3p0.acquireIncrement=5
c3p0.initialPoolSize=20
c3p0.minPoolSize=10
c3p0.maxPoolSize=40

2.4 通过DBCP获取数据库连接

public class C3P0 {
     //2.获取连接
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2.5 关闭连接

注意:我们这里的关闭连接并不是真的关闭了数据库连接,而是将连接回收,重新放入了DBCP中,和我们自定义写的数据库连接池不一样的欧~关的顺序问题我就不再强调了,本仙女的记忆方式,后开的先关

public class C3P0 {
    //3.关闭连接
    public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2.6 测试C3P0

就这么写完了当然要测试一下,那我就简单的用Junit测试一下,顺便带上测试结果,方便您理解这个过程:

测试代码:

	@Test
    public void C3P0Test() {
        //超过最大限制或报"TimeoutException",每打开一个关闭一个就不会发生异常
        for (int i = 0; i < 45; i++) {
            Connection connection = C3P0.getConnection();
            System.out.println(connection.toString() + "\n------------------------------------");
            C3P0.closeAll(connection, null, null);
        }
    }

测试结果:

四月 17, 2019 10:15:13 下午 com.mchange.v2.log.MLog 
信息: MLog clients using java 1.4+ standard logging.
四月 17, 2019 10:15:14 下午 com.mchange.v2.c3p0.C3P0Registry 
信息: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
四月 17, 2019 10:15:14 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 2s8x34a2c40utb1ifmklh|33e5ccce, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 2s8x34a2c40utb1ifmklh|33e5ccce, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql:///mydatabase, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 50, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
com.mchange.v2.c3p0.impl.NewProxyConnection@5419f379 [wrapping: com.mysql.jdbc.JDBC4Connection@7dc7cbad]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@1753acfe [wrapping: com.mysql.jdbc.JDBC4Connection@7c16905e]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@2a5ca609 [wrapping: com.mysql.jdbc.JDBC4Connection@20e2cbe0]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@28feb3fa [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@482f8f11 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@7823a2f9 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@457e2f02 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@39aeed2f [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@4678c730 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@29ee9faa [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@cc285f4 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@8bd1b6a [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@cb5822 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@2b98378d [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@1d057a39 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@4c70fda8 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@14acaea5 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@d8355a8 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@28d25987 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@523884b2 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@61832929 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@3ffc5af1 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@26653222 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@68c4039c [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@59f99ea [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@6f7fd0e6 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@3e6fa38a [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@77caeb3e [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@42d80b78 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@1bce4f0a [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@5c3bd550 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@604ed9f0 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@685cb137 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@7cd62f43 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@6093dd95 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@4883b407 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@39c0f4a [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@42e26948 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@343f4d3d [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@5442a311 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@1a968a59 [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@77cd7a0 [wrapping: com.mysql.jdbc.JDBC4Connection@1593948d]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@e25b2fe [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@146ba0ac [wrapping: com.mysql.jdbc.JDBC4Connection@675d3402]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@6eebc39e [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@13deb50e [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@3abbfa04 [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@31ef45e3 [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@3c0ecd4b [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@5f341870 [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------
com.mchange.v2.c3p0.impl.NewProxyConnection@4f7d0008 [wrapping: com.mysql.jdbc.JDBC4Connection@464bee09]
------------------------------------

Process finished with exit code 0

看到这里你明白C3P0是怎么实现的了吗?

最后,小仙?在这里感谢您看到最后,有收获的话给本仙鱼点个赞吧~

有问题留言呦,再见祝您生活愉快

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C3P0是一个流行的Java数据库连接池管理器,它可以帮助你有效地管理和复用数据库连接,避免频繁创建和关闭连接所带来的性能开销。当你使用C3P0MySQL数据库集成时,你需要进行以下几个步骤: 1. **添加依赖**:在你的项目中,首先需要将C3P0库作为Maven或Gradle的依赖添加到构建文件中。 ```xml <!-- Maven --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> <!-- 选择合适的版本 --> </dependency> // Gradle implementation 'com.mchange:c3p0:0.9.5.2' ``` 2. **配置初始化**:在应用启动时,需要初始化C3P0连接池。通常会在Spring Boot应用中使用`DataSource`接口的配置。 ```java @Configuration public class DataSourceConfig { @Value("${jdbc.url}") private String url; @Value("${jdbc.user}") private String username; @Value("${jdbc.password}") private String password; @Bean public DataSource dataSource() { c3p0.ComboPooledDataSource dataSource = new c3p0.ComboPooledDataSource(); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(password); dataSource.setMaxPoolSize(10); // 设置最大连接数 dataSource.setMinPoolSize(5); // 设置最小连接数 dataSource.setMaxIdleTime(300); // 设置最长空闲时间 return dataSource; } } ``` 3. **注入使用**:在需要使用数据库的地方,你可以通过`@Autowired`注入`DataSource`来获取连接。 ```java @Service public class MyService { @Autowired private DataSource dataSource; public void performTask() { try (Connection connection = dataSource.getConnection()) { // 这里进行数据库操作 } catch (SQLException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值