JDBC常见的几种连接池使用? (C3P0、Druid、HikariCP 、DBCP)
目录
一、 什么是数据库连接池?
在了解 C3P0 数据库连接池之前,让我们先明确什么是数据库连接池。数据库连接池是一个维护数据库连接的池子,它预先创建一定数量的数据库连接,并将这些连接保存在池中,以便应用程序在需要时可以从池中获取连接,而不是每次都创建新的连接。
数据库连接是一种昂贵的资源,创建和销毁连接的开销很大。通过使用连接池,可以避免频繁地创建和销毁连接,提高了数据库访问的性能和效率。连接池还可以控制连接的数量,防止连接数过多导致数据库性能下降,同时还可以管理连接的状态、超时和异常处理。
四种的数据库连接池
1、DBCP
由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。
2、C3P0
开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。
3、Druid
Druid:Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上
4,DBCP
DBCP是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持
四种数据库的属性对比
DBCP | DBCP是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。 是Apache软件基金会的一个项目,提供了一个稳定和可靠的连接池。它是许多Java应用程序的首选选择 |
C3P0 | C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以,hibernate官方推荐使用 |
Druid | Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0,Proxool优点于一身的数据库连接池,但是速度不确定是否有BoneCP快 Druid是一个开源的数据库连接池,具有监控和统计功能,可以帮助开发人员分析数据库连接的使用情况和性能 |
HikariCP | HikariCP是一个轻量级、高性能的数据库连接池,被广泛认为是目前性能最好的连接池之一。它专注于快速的连接获取和释放,适用于高并发的应用程序 |
举例说明:
- DBCP 可以类比为一个城市自来水公司,它负责向一座城市供水。这个水公司(连接池)管理着水的分配和流动,确保城市里的每户家庭都可以获得他们所需的水(数据库连接)。虽然它提供了稳定和可靠的供水服务,但它的运作可能不一定是最高效的,因为它可能需要一些时间来响应不同地区的需求。
- C3P0 可以比作另一家自来水公司,它提供了许多不同的自来水供应计划,可以根据客户的需求进行定制。这家公司提供了灵活的供水方案,允许客户根据他们的特定需求来调整水的流量和质量。
- Druid 就像是一个有水质检测设备的自来水公司,它不仅提供水供应,还监控水的质量,并提供统计数据以帮助客户了解他们的水消耗情况。
- HikariCP 就像是一家高效的自来水公司,它专注于提供最快速的自来水供应。它的供水管道(连接池)设计得非常流畅,可以迅速响应城市中不同区域的需求,确保每家每户都能够获得所需的水。这家自来水公司以其高性能和响应速度而著称。
?C3P0的定义
一、定义
C3P0是一个开源的JDBC连接池,它实现了数据源与JNDI绑定,支持JDBC3规范和实现了JDBC2的标准扩展说明的Connection和Statement池的DataSources对象
即将用于连接数据库的连接整合在一起形成一个随取随用的数据库连接池(Connection pool)
主要特点包括:
- 支持连接池的连接重用和管理。
- 可以配置连接池的各项参数,以满足不同性能需求。
- 具备连接超时、闲置连接的回收、异常处理等功能。
- 提供了 JMX 支持,可以通过 JMX 监控和管理连接池。
- 支持 JDBC3 和 JDBC4。
二,C3P0实操
1,导入jar包
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
2,配置xml文件
通过配置文件进行获取,值得注意的是,如果配置文件的后缀是xml的话,那么这个配置文件的名字只能是c3p0-config.xml
下面是配置的xml文件,可以根据实际进行修改
3,c3p0-config.xml模板
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/stuwork1128db</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
4,创建C3P0类
参数介绍
- ??? initialPoolSize: 连接池初始化时创建的连接数
- ??? minPoolSize: 连接池中保留的最小连接数
- ??? maxPoolSize: 连接池中允许的最大连接数
- ??? acquireIncrement: 连接池自动增长的大小
- ??? maxIdleTime: 连接池中连接的最大空闲时间
- ??? checkoutTimeout: 获取连接的超时时间
- ??? maxStatements: 缓存的PreparedStatement的数量
?
@Test
public void c3p0Show() throws PropertyVetoException, SQLException {
//C3P0的数据源
ComboPooledDataSource dataSource=new ComboPooledDataSource();
//连接数据库参数
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/stuwork1128db");
dataSource.setUser("root");
dataSource.setPassword("root");
//连接池参数设置
dataSource.setInitialPoolSize(5);//初始连接数
dataSource.setMaxPoolSize(20);//最大连接数
dataSource.setCheckoutTimeout(3000);//连接超时
//连接池中获取一个连接
Connection conn=dataSource.getConnection();
ResultSet resultSet=conn.prepareStatement("select * from stuTable").executeQuery();
while (resultSet.next()){
String names=resultSet.getString("name");
System.out.println(names);
}
conn.close();//释放连接
}
简洁代码
@Test
public void c3p0Txte2() throws SQLException {
//C3P0的数据源
ComboPooledDataSource dataSource=new ComboPooledDataSource();
Connection conn=dataSource.getConnection();
ResultSet resultSet=conn.prepareStatement("select * from stuTable").executeQuery();
while (resultSet.next()){
String names=resultSet.getString("name");
System.out.println(names);
}
conn.close();
}
}
运行结果如下:
三、Druid的定义
Druid:Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上
Druid实操
1,导入jar包
2,配置properties文件
定义一个配置文件druid.properties,并在这个配置文件中设置数据库连接的基本信息,url,driverClassName,username,password,同时可以设置数据库连接池的相关信息。
配置文件druid.properties:
参数介绍
- ??? url: 数据库连接URL
- ??? username: 数据库用户名
- ??? password: 数据库密码
- ??? initialSize: 连接池初始化时创建的连接数
- ??? minIdle: 连接池中保留的最小连接数
- ??? maxActive: 连接池中允许的最大活跃连接数
- ??? maxWait: 获取连接的超时时间
?
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/Yiyuanshool
username = root
password = root
initialSize = 10
maxActive = 30
maxWait = 1000
//数据库连接池的核心参数
//使用数据库连接池,需要为其配置一些参数,以控制其工作。
//通常,数据库连接池都会包含以下核心参数:
// 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量//的数据库连接资源被浪费.
// 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加//入到等待队列中,这会影响以后的数据库操作
// 最大空闲时间
// 获取连接超时时间
// 超时重试连接次数
Druid代码示例
@Test
public void show() throws Exception {
//加载配置文件
Properties properties=new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
//在工厂创建一个数据源,数据源的连接信息来源properties配置文件
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
ResultSet rs = connection.prepareStatement("select * from yis").executeQuery();
if(rs.next()){
String name=rs.getString("yi_name");
System.out.println(name);
}
}
运行结果:
四、HikariCP
1,HikariCP的定义
HiKariCP 号称是跑的最快的连接池,并且是 SpringBoot 框架的默认连接池
HiKariCP 为了提升性能,做了很多细节上的优化,例如:
??? 使用 FastList 替代 ArrayList,通过初始化的默认值,减少了越界检查的操作
??? 优化并精简了字节码,通过使用 Javassist,减少了动态代理的性能损耗,比如使用 invokestatic 指令代替 invokevirtual 指令
??? 实现了无锁的 ConcurrentBag,减少了并发场景下的锁竞争
2,配置文件
参数介绍
- ??? url: 数据库连接URL
- ??? username: 数据库用户名
- ??? password: 数据库密码
- ??? initialSize: 连接池初始化时创建的连接数
- ??? minIdle: 连接池中保留的最小连接数
- ??? maxActive: 连接池中允许的最大活跃连接数
- ??? maxWait: 获取连接的超时时间
#加载数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
#数据库连接地址
jdbcUrl=jdbc:mysql://localhost:3306/AABBCA
#数据库用户名
username=root
#数据库密码
password=root
# 连接池名称
poolName=AABBCA
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
测试代码:
public class TEXT{
public void static main(String [] args) throws IOException, SQLException {
Properties properties=new Properties();
properties.load(new FileInputStream("src//AAHikariCP.properties"));
//配置连接池
HikariConfig hikariConfig=new HikariConfig(properties);
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
Connection connection = hikariDataSource.getConnection();
ResultSet resultSet = connection.prepareStatement("select count(* )from movie").executeQuery();
if(resultSet.next()){
int count=resultSet.getInt(1);
System.out.println(count);
}
resultSet.close();
connection.close();
}
}
}
四、DBCP的定义
导入DBCP的jar包的时候,需要注意的是:不可以只是导入dbcp的jar包commons-dbcp2-2.8.0.jar,还需要导入commons-logging-1.2.jar包和commons-pool2-2.9.0.jar,否则就会发生报错
1,配置文件
1、首先定义一个配置文件,这里定义的是dbcp.properties,在配置文件中设置连接的基本信息,例如url/driverClassName/username/password等,同时还可以设置数据库连接池管理的基本信息等
2、在定义数据库连接池这个类中获取BasicDataSource对象时,需要通过BasicDataSourceFactory的静态方法createDataSource(),并且这个方法的参数时我们刚刚定义的配置文件的路径
3、获取BasicDataSource对象之后,调用getConnection方法,从而返回一个Connection对象
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/horecomdb
user=root
pwd=root
代码示例:
@Test
public void Test2() throws IOException {
//从文件中获取配置信息
Properties properties=new Properties();
String file="db.properties";
InputStream is=Test.class.getClassLoader().getResourceAsStream(file);
properties.load(is);
String driver=(String) properties.get("driver");
String url=(String) properties.get("url");
System.out.println(driver+"========"+url);
//源码编译,不好改,然后可以去配置文件改
}
连接成功如下:
连接池汇总
C3P0、DBCP和Druid都是常见的数据库连接池库,它们都提供了高效的管理和复用数据库连接的功能。它们的使用方法类似,通过设置参数来配置连接池的行为,然后通过调用getConnection方法来获取数据库连接。其中,C3P0和DBCP是比较轻量级的连接池库,而Druid是一个功能非常强大的连接池库,提供了许多额外的特性和监控功能。根据实际需求,选择合适的数据库连接池库可以提高数据库访问的性能和效率
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!