c3p0

 在 Java 开发中,使用 JDBC 操作数据库的四个步骤如下 (可以看上一节内容):

      ①加载数据库驱动程序 (Class.forName("数据库驱动类");)
      ②连接数据库 (Connection con  = DriverManager.getConnection();)
      ③操作数据库 (PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
      ④关闭数据库,释放连接 (con.close();)
这里提出了连接池的概念帮我们简化了步骤
连接池是一直保持连接的建立,有执行就执行操作。相当于只执行上面的第三步
数据库连接池负责分配, 管理和释放数据库连接, 它允许应用程序重复使用一个现有的数据库连接, 而不是重新建立一个。
最小连接数: 是连接池一直保持的数据库连接, 所以如果应用程序对数据库连接的使用量不大, 将会有大量的数据库连接资源被浪费.
最大连接数: 是连接池能申请的最大连接数, 如果数据库连接请求超过次数, 后面的数据库连接请求将被加入到等待队列中, 这会影响以后的数据库操作

c3p0 就是连接池的一种实现帮我们简化了步骤,c3p0 有两种配置方法,
这里只讲简单的通过 xml 文件配置,将这个文件放到项目的 src 下 -- 我一般放置在 maven 项目的 resources 下
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,只可以出现一次 -->
    <default-config>
        <!-- 配置 JDBC 四个基本属性 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/goods?characterEncoding=utf8&amp;useSSL=false
        </property>
        <property name="user">zhangsan</property>
        <property name="password">123123</property>
        <!-- 当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement">3</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">2</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">10</property>
    </default-config>
&lt;named-config name="mysql"&gt;
    &lt;!-- 配置JDBC 四个基本属性 --&gt;
    &lt;property name="driverClass"&gt;com.mysql.cj.jdbc.Driver&lt;/property&gt;
    &lt;property name="jdbcUrl"&gt;jdbc:mysql:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1:3306/goods?characterEncoding=utf8&amp;amp;useSSL=false</span>
    &lt;/property&gt;
    &lt;property name="user"&gt;zhangsan&lt;/property&gt;
    &lt;property name="password"&gt;123123&lt;/property&gt;
    &lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt;
    &lt;property name="acquireIncrement"&gt;3&lt;/property&gt;
    &lt;!-- 初始化数据库连接池时连接的数量 --&gt;
    &lt;property name="initialPoolSize"&gt;5&lt;/property&gt;
    &lt;!-- 数据库连接池中的最小的数据库连接数 --&gt;
    &lt;property name="minPoolSize"&gt;2&lt;/property&gt;
    &lt;!-- 数据库连接池中的最大的数据库连接数 --&gt;
    &lt;property name="maxPoolSize"&gt;10&lt;/property&gt;
&lt;/named-config&gt;

</c3p0-config>

java 代码如下 --- 需要导入 c3p0 包

package db;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.*;
public class TestC3p0 {
    public static void main(String[] args) {
        ComboPooledDataSource ds=new ComboPooledDataSource();
        Connection conn=null;
        Statement statement=null;
        try {
            conn =ds.getConnection();
            String sql ="select * from t_user_test";
            statement =conn.createStatement();
            ResultSet set =statement.executeQuery(sql);
            ResultSetMetaData data=set.getMetaData();
            System.out.println(data.getColumnCount()); //一共有多少列
            System.out.println(data.getColumnName(1)); //第一列的列名
        <span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)"> (set.next()) {
            System.out.println(set.getString(</span>1)+" "+set.getString(2)+" "+set.getString(3<span style="color: rgba(0, 0, 0, 1)">));
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        e.printStackTrace();
    }</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(conn!=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
                conn.close();
                statement.close();
            }

        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
            e.printStackTrace();
        }

    }
}

}