相关文章链接:

数据库裸JDBC

需要的c3p0的jar包: c3p0

观前提示:

本文使用的Eclipse版本为Photon Release (4.8.0),数据库为Mysql 5.7.24。

1.简介

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

c3p0与dbcp区别:

  1. dbcp没有自动回收空闲连接的功能。

  2. c3p0有自动回收空闲连接功能。

c3p0-0.9.2.jar、mchange-commons-java-0.2.6.jar

2.通过set方法实现

JdbcUtils_C3P0.java

package c3p0;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils_C3P0 {

	private static ComboPooledDataSource ds = null;
	//在静态代码块中创建数据库连接池
	static {
		try {
			//通过代码创建C3P0数据库连接池
			ds = new ComboPooledDataSource();
			ds.setDriverClass("com.mysql.jdbc.Driver");          //连接驱动
			ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");   //连接数据库url
			ds.setUser("root");                                  //数据库用户名
			ds.setPassword("root");                              //数据库密码
			ds.setInitialPoolSize(10);                           //初始化连接:连接池启动时创建的初始化连接数量
			ds.setMinPoolSize(5);                                //连接池中保留的最小连接数
			ds.setMaxPoolSize(20);                               //连接池中保留的最大连接数
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	/**
	 * @Method: getConnection
	 * @Description: 从数据源中获取数据库连接
	 * @return
	 * @throws SQLException
	 * @create 2018-12-14 by jjy
	 */
	public static Connection getConnection() throws SQLException {
		//从数据源中获取数据库连接
		return ds.getConnection();
	}
	
	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();
			}
		}
	}
}

DataSourceTest.java

package c3p0;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DataSourceTest {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//获取数据库连接
			conn = JdbcUtils_C3P0.getConnection();
			String sql = "SELECT * FROM USER";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				System.out.println(rs.getString("ID"));
				System.out.println(rs.getString("NAME"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放资源
			JdbcUtils_C3P0.release(conn, ps, rs);
		}
	}
}

数据库表数据
在这里插入图片描述
运行结果
在这里插入图片描述

2.通过配置c3p0-config.xml文件实现

注:需要将c3p0-config.xml文件放在src路径下。

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConectionTestPeriod">30</property>
		<property name="initalPoolSize">3</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">2</property>
		<property name="maxStatements">200</property>
	</default-config>
	<!-- 命名的配置,可以通过方法调用实现 -->
	<named-config name="test">
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<!-- 如果池中数据连接不够时一次增长多少个 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化数据库连接池时连接的数量 -->
		<property name="initialPoolSize">20</property>
		<!-- 数据库连接池中的最大的数据库连接数 -->
		<property name="maxPoolSize">25</property>
		<!-- 数据库连接池中的最小的数据库连接数 -->
		<property name="minPoolSize">5</property>
	</named-config>
</c3p0-config>

JdbcUtils_C3P0.java

package c3p0Xml;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils_C3P0 {

	static ComboPooledDataSource ds = null;
	
	static {
		ds = new ComboPooledDataSource("test");
	}
	
	/**
	 * @Method: getConnection
	 * @Description: 从数据源中获取数据库连接
	 * @return
	 * @create 2018-12-14 by jjy
	 */
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	
	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();
			}
		}
	}
}

DataSourceTest.java

package c3p0Xml;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DataSourceTest {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//获取数据库连接
			conn = JdbcUtils_C3P0.getConnection();
			String sql = "SELECT * FROM USER";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				System.out.println(rs.getString("ID"));
				System.out.println(rs.getString("NAME"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放资源
			JdbcUtils_C3P0.release(conn, ps, rs);
		}
	}
}

数据库表数据

在这里插入图片描述

运行结果

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐