DBCP:DataBase Connection Pool,数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池是apache上的一个java连接池预先同数据库建立一些连接放在内存中()即连接池中,应用程序需要建立数据库连接时直接到连接池中拿一个连接使用,用完后连接池回收该连接,从而达到连接服用,减少资源消耗的目的
常见连接池(DBCP)
1.DBCP:
DBCP是Apache Commons项目的一部分,它提供了一个基本的数据库连接池实现。它支持连接池的基本功能,例如连接的创建、销毁、管理等。DBCP相对较旧,使用起来相对简单,但在高并发和大规模应用中可能存在性能问题。
2.C3P0
C3P0:C3P0是一个流行的开源连接池库,它提供了一些高级功能和配置选项。它支持连接池的连接管理、连接池大小的动态调整、连接的超时控制、连接的自动重试等。C3P0还提供了对JNDI和JMX的支持,并允许通过配置文件或编程方式进行灵活的配置。
3.Hikari
HikariCP:HikariCP是一个高性能的轻量级连接池库,它旨在提供卓越的性能和可扩展性。它具有快速的启动速度和低延迟,适用于高并发的应用场景。HikariCP通过精心优化的连接池算法和线程池实现,以及对连接的有效性验证和超时控制等功能,提供了出色的性能。
4.Durid
Druid:Druid是阿里巴巴开源的一个数据库连接池和SQL执行框架。它具有连接池管理、连接的有效性检查、连接的超时控制、SQL防注入等功能。Druid还提供了对统计和监控的支持,可以收集连接池和SQL执行的性能指标,以便进行监控和调优。
创建Maven工程,引入DBCP依赖
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>
public class Demo05 {
public static void main(String[] args) throws SQLException {
//连接池有个数据源对象,好比放的就是Connection conn(用来设置数据库连接的配置信息:url,username,password)
BasicDataSource ds=new BasicDataSource();
//设置数据库连接的配置信息
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("url");
ds.setUsername("username");
ds.setPassword("password");
//设置最大连接数
ds.setMaxActive(5);
//设置数据库的初始化连接池大小
ds.setInitialSize(10);
Connection connection=ds.getConnection();
System.out.println("获得连接对象:"+connection);
}
}
/**
* @author hrui
* @date 2023/5/29 20:59
*/
public class DBUtils {
//连接池对象
private static BasicDataSource dataSource;
private static String url;
private static String username;
private static String password;
private static String initialSize;
private static String maxActive;
private static String minIdle;
private static String maxIdle;
static{
//创建数据源连接池对象
dataSource=new BasicDataSource();
//加载jdbc.properties配置文件
//获取.properties输入流
InputStream inputStream= DBUtils.class.getClassLoader().getResourceAsStream("conf/jdbc.properties");
//创建Properties对象
Properties properties=new Properties();
try {
//加载属性文件
//properties.load(inputStream);
//中文乱码问题
properties.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
//读取属性值
String driver=properties.getProperty("driver");
System.out.println(driver);
Class.forName(driver);
dataSource.setUrl(properties.getProperty("url"));
dataSource.setUsername(properties.getProperty("username"));
dataSource.setPassword(properties.getProperty("password"));
dataSource.setInitialSize(Integer.parseInt(properties.getProperty("initialSize")));
dataSource.setMaxActive(Integer.parseInt(properties.getProperty("maxActive")));
dataSource.setMinIdle(Integer.parseInt(properties.getProperty("minIdle")));
dataSource.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Connection getConnection() throws SQLException {
//这里的连接对象是从连接池里获取到的
return dataSource.getConnection();
}
//这里的关闭是将Connection放回连接池中 其实只需要关Connection就可以了
public static void close(Connection conn, Statement st, ResultSet rs){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(st!=null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class Demo06 {
public static void main(String[] args) throws SQLException {
Connection connection = DBUtils.getConnection();
System.out.println(connection);
}
}
其实关闭Connection即可
MySQL JDBC驱动程序通常如何处理关闭Connection
时的Statement
和ResultSet
。
根据MySQL Connector/J(MySQL官方的JDBC驱动程序)的行为,它会在关闭Connection
时自动关闭相关的Statement
和ResultSet
。
在MySQL Connector/J的实现中,当调用Connection
对象的close()
方法时,会触发一系列的清理操作,其中包括关闭与该连接关联的所有Statement
和ResultSet
对象。这是通过在ConnectionImpl
类的realClose()
方法中执行相关操作来实现的。