目录
项目结构
这里mysql的jar包和c3p0的两个jar包必须存在,否则不会成功。
c3p0的jar包大家可以去我的百度云盘下载。
c3p0-config.xml文件配置
命名必须为c3p0-config.xml。c3p0-config.xml文件必须放在src目录下,c3p0会默认加载src目录下的c3p0-config.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 这是默认配置信息 -->
<default-config>
<!-- 连接四大参数配置 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property><!--test为数据库名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property> <!-- 用户名 -->
<property name="password">root</property> <!-- 密码 -->
<!-- 池参数配置 -->
<!-- 初始连接数 -->
<property name="initialPoolSize">10</property>
<!-- 最小连接数 -->
<property name="minPoolSize">2</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">10</property>
<!-- 创建的新数据库连接数 -->
<property name="acquireIncrement">3</property>
<!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
<property name="maxStatements">50</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">2000</property>
</default-config>
<named-config name="c3p01">
<!-- 连接四大参数配置 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property><!--test为数据库名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property> <!-- 用户名 -->
<property name="password">root</property> <!-- 密码 -->
<!-- 池参数配置 -->
<!-- 初始连接数 -->
<property name="initialPoolSize">10</property>
<!-- 最小连接数 -->
<property name="minPoolSize">2</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">8</property>
<!-- 创建的新数据库连接数 -->
<property name="acquireIncrement">3</property>
<!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
<property name="maxStatements">50</property>
<!-- 超时时间 -->
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
书写JDBCUtil工具类
package utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtil {
private static DataSource ds = new ComboPooledDataSource();
// 获取连接池
public static DataSource getDataSource() {
return ds;
}
// 获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//归还连接
public static void close(ResultSet resultSet, PreparedStatement pstmt, Connection conn) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这里填入参数可以使用我们c3p0-config.xml中的第二个配置(可以多个),无参则使用默认配置。
private static DataSource ds = new ComboPooledDataSource("c3p01");
JDBCUtil工具类我也参考了别人,链接:https://blog.csdn.net/qq_42035966/article/details/81332343
数据库连接测试
Demo1:
package c3p0;
import java.sql.Connection;
import java.sql.SQLException;
import utils.JDBCUtil;
public class c3p0demo {
public static void main(String[] args) throws SQLException {
for(int i=0;i<=10;i++) {
Connection conn =JDBCUtil.getConnection();
System.out.println(i+":"+conn);
if(i==3) {
conn.close();
}
}
}
}
出现上图最上方那些信息说明,证明我们的c3p0配置成功。
这是一个简单的测试,用来获取每一个连接的信息,其中红框圈出来的值相同,
我们以前调用close()方法是关闭了连接,而在线程池中close()方法是把使用完的连接归还给连接池以便下一个申请调用。
Demo2:
package c3p0;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import utils.JDBCUtil;
public class c3p0_select_test {
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement stmt = null;
String id = null;
String name = null;
String sex = null;
conn = JDBCUtil.getConnection();
stmt = conn.createStatement();
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
// 表查询
while (rs.next()) {
id = rs.getString("id");
name = rs.getString("username");
sex = rs.getString("sex");
if (id == null) {
System.out.println("表为空!");
} else {
System.out.println("id = " + id + "," + "name = " + name + ", " + "sex= " + sex);
}
}
}
}
这是一个基于c3p0的简单查表,使用JDBCUtil工具类进行c3p0的连接并测试查表。