数据库连接池C3P0//DBCP
数据库连接池
数据库连接---执行---释放
连接----释放 十分浪费系统资源
池化技术:准备一些预先的资源,过来就连接预先准备好的
最小连接数:10
最大连接数:15
等待超时:100ms
编写连接池,实现一个接口 DateSource
开源数据源实现
-
DBCP
-
C3P0
-
Druid:阿里巴巴
使用这些连接池之后,就不用在开发项目中就不需要编写连接数据库的代码了
DBCP
配置文件
#连接设置(每一个名称不能改动)
driverClassName=com.mysql.cj.jdbc.Driver
#jdbctest为数据库名
url=jdbc:mysql://localhost:3306/jdbcstudy?useEncode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
工具类
package JDBCmysql.JDBCtest;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @author liu
*/
public class Demo01 {
private static BasicDataSource dataSource = null;
static {
try {
InputStream in = Demo01.class.getClassLoader().getResourceAsStream("dbcpConfig.properties");
Properties properties = new Properties();
properties.load(in);
//创建数据源工厂 工厂模式--》创建数据源对象
dataSource = BasicDataSourceFactory.createDataSource(properties);
System.out.println(1);
} catch (Exception e) {
e.printStackTrace();
} catch(Error er) {
er.printStackTrace();
}
}
public static Connection getTConnection() throws SQLException {
return dataSource.getConnection();
}
//。关闭资源,释放连接
public static void Cclose(ResultSet rs, PreparedStatement preparedStatement, Connection connection) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Test
package JDBCmysql.JDBCtest;
import java.sql.*;
/**
* @author liu
*/
public class JDBC_Test {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//区别
//使用? 占位符代替参数
connection = JDBCmysql.JDBCtest.Demo01.getTConnection();
//预编译sql,先写sql,然后不执行
String sql = "INSERT INTO users (id,name,psw, email, birthday)" + "VALUES(?,?,?,?,?);";
//手动给参数赋值
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 6);
preparedStatement.setString(2, "xiaohong");
preparedStatement.setObject(3, "123456");
preparedStatement.setString(4, "22222@222.com");
//注意点 sql。date 数据库类型的时间 java.sql.Date()
// util.date java类型的时间 new Date().getTime()
preparedStatement.setDate(5, new java.sql.Date(new java.util.Date().getTime()));
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Demo01.Cclose(null, preparedStatement, connection);
}
}
C3P0
配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="user">root</property>
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">3</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置,可以通过方法调用实现 第二套数据test -->
<named-config name="test">
<property name="user">root</property>
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</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>
test
package JDBCmysql.C3P0test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class C3P0_Test02 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//区别
//使用? 占位符代替参数
connection = test01.getTConnection();
//预编译sql,先写sql,然后不执行
String sql = "INSERT INTO users (id,name,psw, email, birthday)" + "VALUES(?,?,?,?,?);";
//手动给参数赋值
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 6);
preparedStatement.setString(2, "xiaohong");
preparedStatement.setObject(3, "123456");
preparedStatement.setString(4, "22222@222.com");
//注意点 sql。date 数据库类型的时间 java.sql.Date()
// util.date java类型的时间 new Date().getTime()
preparedStatement.setDate(5, new java.sql.Date(new java.util.Date().getTime()));
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
test01.Cclose(null, preparedStatement, connection);
}
}
}
工具类
package JDBCmysql.C3P0test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author liu
*/
public class test01 {
private static DataSource dataSource = null;
/* private static ComboPooledDataSource dataSource = null;
* dataSource =new ComboPooledDataSource();
* dataSource.setDriverClass();
*dataSource.setUser();
* dataSource.setpassword();
* dataSource.setJDBCurl();
*代码版本的配置写法
* */
static {
try {
// 哪里配置数据库信息的,账号密码? 奇怪,我怎么注释掉了都报这个错,是不是这个错就是没连接到数据库,没读取到配置
//利用xml文件配置好的写法
dataSource = new ComboPooledDataSource();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getTConnection() throws SQLException {
return dataSource.getConnection();
}
//。关闭资源,释放连接
public static void Cclose(ResultSet rs, PreparedStatement preparedStatement, Connection connection) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?