zoukankan      html  css  js  c++  java
  • c3p0 连接池

    C3P0数据源

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

      c3p0与dbcp区别
    1. dbcp没有自动回收空闲连接的功能
    2. c3p0有自动回收空闲连接功能

    创建c3p0-config.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- c3p0-config.xml必须位于类路径下面 -->
    
    <c3p0-config>
        <!-- C3P0的缺省(默认)配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->
        <default-config>
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    
            <property name="acquireIncrement">5</property>
            <property name="initialPoolSize">10</property>
            <property name="minPoolSize">5</property>
            <property name="maxPoolSize">20</property>
        </default-config>
    
        <!-- C3P0的命名配置, 如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源 -->
        <named-config name="MySQL">
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/testsvnb?useSSL=false&amp;serverTimezone=Hongkong&amp;characterEncoding=utf-8&amp;autoReconnect=true</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    
            <property name="acquireIncrement">5</property>
            <property name="initialPoolSize">10</property>
            <property name="minPoolSize">5</property>
            <property name="maxPoolSize">20</property>
        </named-config>
    
    </c3p0-config>

    创建JdbcUtils_C3P0:

    package com.xc.jdbc.util;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    /**
     * @ClassName: JdbcUtils_C3P0
     * @Description: 数据库连接工具类
     * @author: 孤傲苍狼
     * @date: 2014-10-4 下午6:04:36
     */
    public class JdbcUtils_C3P0 {
    
        private static ComboPooledDataSource ds = null;
        // 在静态代码块中创建数据库连接池
        static {
            try {
                // 通过代码创建C3P0数据库连接池
                // ds = new ComboPooledDataSource();
                // ds.setDriverClass("com.mysql.cj.jdbc.Driver");
                // ds.setJdbcUrl("jdbc:mysql://localhost:3306/testsvnb?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true");
                // ds.setUser("root");
                // ds.setPassword("123456");
                // ds.setInitialPoolSize(10);
                // ds.setMinPoolSize(5);
                // ds.setMaxPoolSize(20);
    
                // 通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下
                ds = new ComboPooledDataSource();// 使用C3P0的默认配置来创建数据源
                // ds = new ComboPooledDataSource("MySQL");// 使用C3P0的命名配置来创建数据源
    
            } catch (Exception e) {
                throw new ExceptionInInitializerError(e);
            }
        }
    
        /**
         * @Method: getConnection
         * @Description: 从数据源中获取数据库连接
         * @Anthor:孤傲苍狼
         * @return Connection
         * @throws SQLException
         */
        public static Connection getConnection() throws SQLException {
            // 从数据源中获取数据库连接
            return ds.getConnection();
        }
    
        /**
         * @Method: release
         * @Description: 释放资源, 释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
         * @Anthor:孤傲苍狼
         *
         * @param conn
         * @param st
         * @param rs
         */
        public static void release(Connection conn, Statement st, ResultSet rs) {
            if (rs != null) {
                try {
                    // 关闭存储查询结果的ResultSet对象
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                rs = null;
            }
            if (st != null) {
                try {
                    // 关闭负责执行SQL命令的Statement对象
                    st.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            if (conn != null) {
                try {
                    // 将Connection连接对象还给数据库连接池
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * @Method: getDataSource
         * @Description: 获取数据源
         * @Anthor:孤傲苍狼
         * @return DataSource
         */
        public static DataSource getDataSource() {
            // 从数据源中获取数据库连接
            return ds;
        }
    
    }

    创建测试类DataSourceTest:

    package com.xc.jdbc.curd;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import org.junit.Test;
    
    import com.xc.jdbc.util.JdbcUtils_C3P0;
    import com.xc.jdbc.util.JdbcUtils_DBCP;
    
    public class DataSourceTest {
    
        @Test
        public void c3p0DataSourceTest() {
            Connection conn = null;
            PreparedStatement st = null;
            ResultSet rs = null;
            try {
                // 获取数据库连接
                conn = JdbcUtils_C3P0.getConnection();
                String sql = "insert into test1(name) values(?)";
                st = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
                st.setString(1, "gacl");
                st.executeUpdate();
                // 获取数据库自动生成的主键
                rs = st.getGeneratedKeys();
                if (rs.next()) {
                    System.out.println(rs.getInt(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 释放资源
                JdbcUtils_C3P0.release(conn, st, rs);
            }
        }
    
    }

    参考文章:

    https://www.cnblogs.com/xdp-gacl/p/4002804.html

  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/ooo0/p/10349883.html
Copyright © 2011-2022 走看看