JDBC与DBCP整合

news/2024/10/17 20:28:28/

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时的StatementResultSet

根据MySQL Connector/J(MySQL官方的JDBC驱动程序)的行为,它会在关闭Connection时自动关闭相关的StatementResultSet

在MySQL Connector/J的实现中,当调用Connection对象的close()方法时,会触发一系列的清理操作,其中包括关闭与该连接关联的所有StatementResultSet对象。这是通过在ConnectionImpl类的realClose()方法中执行相关操作来实现的。


http://www.ppmy.cn/news/104031.html

相关文章

北京发布Web3.0白皮书!币圈扬言:国际金融格局即将重塑!

如今&#xff0c;虚拟资产已成为香港数字经济与金融创新的“桥头堡”。随着加密新政生效在即&#xff0c;市场暗流涌动&#xff0c;头部交易所争相布局&#xff0c;香港或将迎来新一轮的加密竞争。 多家交易所进军香港 5月28日&#xff0c;欧易&#xff08;OKX&#xff09;完成…

Vivado综合属性系列之十三 FSM_ENCODING

目录 一、前言 二、FSM_ENCODING ​2.1 属性介绍 ​2.2 工程代码 2.3 结果 ​2.4 参考资料 一、前言 ​状态机的实现有很多方式&#xff0c;如auto&#xff0c;one_hot&#xff0c;sequential&#xff0c;如下图中Synthesis中-fsm_extraction的配置项&#xff0c;但此处作用范…

Hadoop优化

1.小文件 影响&#xff1a; 元数据的瓶颈在于文件的数量&#xff0c;无论单个文件的大小 资源大材小用 优化 计算&#xff1a;使用combininputformat提前合并小文件 JVM重用 存储&#xff1a;归档 2.map端 环形缓冲区-区域大小、溢写比列 提前combiner&#xff…

FMT ICF5实时仿真,不止于飞控

基于ICF5的实时仿真 作为FMT的首款自研的国产开源飞控硬件平台&#xff0c;ICF5不仅功能强大&#xff0c;而且高颜值和高性价比获得了用户的一致好评。 FMT ICF5飞控 ICF5购买链接​item.taobao.com/item.htm?id705459383848&ali_refida3_430620_1006:1123834906:N:O3mc…

msvcr90.dll丢失的解决方法

在使用计算机的过程中&#xff0c;我们时常会遇到一些问题&#xff0c;比如应用程序无法正常启动&#xff0c;提示msvcr90.dll文件丢失&#xff0c;这个问题困扰了许多计算机用户。那么&#xff0c;怎么才能解决这个问题呢&#xff1f; 首先&#xff0c;让我们先了解一下msvcr…

Vue.js开发必备插件大曝光:Clipboard.js, Vue-Lazyload等库介绍

部分数据来源&#xff1a;ChatGPT 1、Lodash Lodash 是一个 JavaScript 实用工具库&#xff0c;提供了很多常用函数的封装&#xff0c;例如对象处理、数组处理、字符串处理等。Lodash 可以在浏览器中直接使用&#xff0c;也可以使用 npm 安装后在 Node.js 中使用。 // 安装方…

Spring MVC 深度解析与应用实践

文章目录 1. 引言1.1 Spring MVC 概述1.2 Spring MVC 在 MVC 架构中的位置 2. Spring MVC 的工作流程2.1 DispatcherServlet (前端控制器)2.2 HandlerMapping (处理器映射器)2.3 Handler (处理器)2.4 ModelAndView2.5 ViewResolver (视图解析器) 3. Spring MVC 基础应用3.1 环境…

kotlin用CoroutineScope启动协程async等待结果返回

kotlin用CoroutineScope启动协程async等待结果返回 例如&#xff1a; import kotlinx.coroutines.*object MyCoroutineScope {private val coroutineContext Job() Dispatchers.Default CoroutineName("my_context")val coroutineScope CoroutineScope(corouti…