• C3P0连接池的使用


    一、什么是C3P0

          我们开始实现了一个自定义的连接池,那么C3P0连接池和我们自定义那个就差不多了,只是它是一个开源的,比我们自己实现的要强大很多的连接池。下面为百科上的定义:

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

    二、如何使用C3P0

        首先我们先要引入C3P0的jar包,(当然连接mysql是少不了mysql的驱动包的),我这里因为使用的Maven,就直接引入到pom文件中了

    <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

    然后我们使用的时候就直接new出ComboPooledDataSource对象就可以了 ,然后去设置它的一些需要连接数据库的参数,如下:

    ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
            dataSource.setUser("root");
            dataSource.setPassword("root");

    那么,一个最简单的C3P0就可以使用了,我们就可以像JDBC那样去获得连接,使用连接了,完整测试代码如下:

    public static void main( String[] args ) throws SQLException, PropertyVetoException
        {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
            dataSource.setUser("root");
            dataSource.setPassword("root");
            Connection conn = dataSource.getConnection();
            String sql = "select * from user where u_id = ?";
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                ps = conn.prepareStatement(sql);
                ps.setInt(1, 1);
                rs = ps.executeQuery();
                while (rs.next()) {
                    System.out.println("id="+rs.getInt(1));
                    System.out.println("username="+rs.getString(2));
                    System.out.println("password="+rs.getString(3));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils_V3.close(conn, ps, rs);//这是本人自己封装的一个关闭资源的方法,非C3P0所提供
            }
        }

    OK,一个简单的C3P0使用测试案例就完成了,但是,为了避免硬编码,C3P0提供对配置文件的引入,支持xml,和properties文件,我这里就使用xml文件,properties不做介绍

    文件如下:

    <?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/test</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!-- 初始化连接池的连接数 -->
        <property name="initialPoolSize">5</property>
        <!-- 连接池中最大的连接数 -->
        <property name="maxPoolSize">20</property>
      </default-config>
      
      <!-- 当需要使用这里的配置时只需要在创建对象的时候传入这个的name值,即oracle -->
      <named-config name="oracle"> 
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///web_07</property>
        <property name="user">root</property>
        <property name="password">123</property>
      </named-config>
      
    
    </c3p0-config>

    其中注释都已经很清楚,值得注意的是,C3P0默认配置文件的路径是在classpath下,且文件名必须为c3p0-config.xml;当然,C3P0的配置不会这么简单,还有很多配置项是可以去配置优化的,详细可以去官网查看文档介绍,会更好。

    配置文件方式的测试代码如下:

    public static void main( String[] args ) throws SQLException, PropertyVetoException
        {
            //因为有配置文件存在且在类路径下,所以创建此对象的时候就会去加载默认路径下名为c3p0-config.xml的配置文件
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //        dataSource.setDriverClass("com.mysql.jdbc.Driver");
    //        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
    //        dataSource.setUser("root");
    //        dataSource.setPassword("root");
            Connection conn = dataSource.getConnection();
            String sql = "select * from user where u_id = ?";
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                ps = conn.prepareStatement(sql);
                ps.setInt(1, 1);
                rs = ps.executeQuery();
                while (rs.next()) {
                    System.out.println("id="+rs.getInt(1));
                    System.out.println("username="+rs.getString(2));
                    System.out.println("password="+rs.getString(3));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils_V3.close(conn, ps, rs);//这是本人自己封装的一个关闭资源的方法,非C3P0所提供
            }
        }

    OK,c3p0的使用就这样了 。

    热爱生活,积极进取!
  • 相关阅读:
    python异常处理--try except else raise finally
    WEB自动化+Allure+Jenkins定时构建
    pytest框架优化——将异常截屏图片加入到allure报告中
    pytest框架优化——清理历史截图图片和allure报告文件
    allure 定制化输出测试报告,用例模块名称、用例名称、测试用例的严重级别、测试用例的步骤、用于向测试报告中输入一些附加的信息,通常是一些测试数据信息、链接、用例描述
    Jenkins—Master/Slave 模式
    Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办?
    pytest 框架之 allure 报告
    pytest 之重运行机制:rerunfailures
    pytest 之 fixture 的前置后置功能
  • 原文地址:https://www.cnblogs.com/samluby/p/8076330.html
Copyright © 2020-2023  润新知