JDBC 数据库连接池

目录

  • 一、什么是数据库连接池
  • 二、为什么需要数据库连接池?
  • 三、JDBC 数据库连接池的实现
  • 四、C3P0的使用
    • 1、加入c3p0 jar包
    • 2、配置xml文件
    • 3、c3p0-config.xml模板
    • 4、C3P0的使用
  • 五、Druid的使用
    • 1、加入Druid jar包
    • 2、定义配置文件:
    • 3、Druid连接池的使用
  • 六、HikariCP的使用
    • 1、加入HikariCP jar包
    • 2、配置文件
    • 3、HikariCP的使用
  • 七、DBCP的使用
    • 1、加入DBCP jar包
    • 2、配置文件
    • 3、DBCP使用

在这里插入图片描述

一、什么是数据库连接池

概念:存放数据库连接的一个容器(集合)Connection
当系统运行起来之后,这个连接池就被创建,在这个连接池当中,会申请一些对象,当有用户来访问数据库的时候,就从这个连接池当中获取连接对象,用户访问结束之后,连接池对象会归还给容器

二、为什么需要数据库连接池?

数据库连接的创建和销毁是一项资源密集型操作,它涉及到网络通信和权限验证等操作,因此开销较大。在高并发的应用中,频繁地创建和销毁连接会导致系统性能下降,甚至引发连接泄漏等问题。数据库连接池的引入可以解决这些问题,具体好处包括:

  • 资源重用:连接池可以重复使用现有的连接,避免了频繁创建和销毁连接的开销。
  • 减少连接等待时间:连接池通常会预先创建一些连接,当应用程序需要连接时,可以立即获取可用连接,降低了连接等待时间。
  • 连接管理:连接池负责连接的管理,包括连接的创建、销毁、超时检测等,减轻了开发人员的工作负担。
  • 性能提升:通过连接池可以控制并发连接数,避免了数据库服务器被大量连接请求压垮。

三、JDBC 数据库连接池的实现

JDBC 数据库连接池通常由以下几个关键组件构成:

  • 连接池管理器:用于管理连接的创建、分配、释放等操作。
  • 连接池:实际存放数据库连接的容器。
  • 连接对象:表示一个数据库连接的对象,包括连接信息、状态等。
  • 连接池配置:包括最大连接数、最小连接数、连接超时时间等参数。

四、C3P0的使用

1、加入c3p0 jar包

在这里插入图片描述

2、配置xml文件

在这里插入图片描述

3、c3p0-config.xml模板

<c3p0-config><!--使用默认的配置读取数据库连接池对象 --><default-config><!--  连接参数 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/ScienceDB?serverTimezone=UTC</property><property name="user">root</property><property name="password"></property><!-- 连接池参数 --><!--初始化申请的连接数量--><property name="initialPoolSize">5</property><!--最大的连接数量--><property name="maxPoolSize">20</property><!--超时时间--><property name="checkoutTimeout">3000</property></default-config>
</c3p0-config>

4、C3P0的使用

public void sumSelect(String a) throws SQLException {ComboPooledDataSource dataSource=new ComboPooledDataSource();Connection conn=dataSource.getConnection();ResultSet rs=conn.prepareStatement("select s.*,c.c_name,sc.s_score from Student s,Score sc ,Course c\n" +"where s.s_id=sc.s_id and sc.c_id=c.c_id and s.s_id='"+a+"'").executeQuery();while (rs.next()){String s_id=rs.getString(1);String s_name=rs.getString(2);String s_birth=rs.getString(3);String s_sex=rs.getString(4);String c_name=rs.getString(5);int zf=rs.getInt(6);System.out.println(s_id+"\t"+s_name+"\t"+s_birth+"\t"+s_sex +"\t"+c_name+"\t"+zf);}conn.close();//释放连接----》将当前的工作连接,释放为空闲连接}

五、Druid的使用

1、加入Druid jar包

在这里插入图片描述

2、定义配置文件:

是properties形式的
在这里插入图片描述

driverClassName =com.mysql.cj.jdbc.Driver;
url=jdbc:mysql://localhost:3306/20231202DB?useServerPrepStmts=true;
username=root;
password=root;
#初始化连接数
initialSize=10;
#最大等待时间
maxwait=5000
#最大连接数
maxActive=50;
minIdle=5;

3、Druid连接池的使用

 public void druidTest() throws Exception {Properties properties=new Properties();HashMap map=new HashMap();map.put("driverClassName","com.mysql.cj.jdbc.Driver");map.put("url","jdbc:mysql://localhost:3306/20231202DB?serverTimezone=UTC");map.put("username","root");map.put("password","");map.put("initialSize","10");map.put("maxActive","30");map.put("maxWait","1000");properties.load(new FileInputStream("src\\jdbc.properties"));DataSource dataSource= DruidDataSourceFactory.createDataSource(map);Connection conn=dataSource.getConnection();ResultSet rs=conn.prepareStatement("select count(*) s from film_information").executeQuery();while (rs.next()){int tps=rs.getInt("s");System.out.println(tps);}conn.close();//释放连接----》将当前的工作连接,释放为空闲连接}

六、HikariCP的使用

1、加入HikariCP jar包

在这里插入图片描述

2、配置文件

在代码中配置 HikariCP 连接池。以下是一个示例配置:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;public class DatabaseConnectionManager {private static HikariConfig config = new HikariConfig();private static HikariDataSource dataSource;static {config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");config.setUsername("root");config.setPassword("password");config.setMaximumPoolSize(10); // 最大连接数config.setMinimumIdle(5); // 最小空闲连接数config.setConnectionTimeout(30000); // 连接超时时间,单位毫秒config.setIdleTimeout(600000); // 空闲连接超时时间,单位毫秒config.setMaxLifetime(1800000); // 最大生命周期时间,单位毫秒dataSource = new HikariDataSource(config);}public static Connection getConnection() throws SQLException {return dataSource.getConnection();}
}

3、HikariCP的使用

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class Main {public static void main(String[] args) {try (Connection connection = DatabaseConnectionManager.getConnection()) {String sql = "SELECT * FROM users";try (PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery()) {while (resultSet.next()) {int userId = resultSet.getInt("id");String username = resultSet.getString("username");String email = resultSet.getString("email");System.out.println("User ID: " + userId + ", Username: " + username + ", Email: " + email);}}} catch (SQLException e) {e.printStackTrace();}}
}

七、DBCP的使用

1、加入DBCP jar包

在这里插入图片描述

2、配置文件

#数据库连接地址 
#url=jdbc:mysql://localhost:3306/数据库名(?配置参数)
url=jdbc:mysql://localhost:3306/express_manage?useUnicode=true&characterEncoding=utf-8
#数据库驱动类的全名
driverClassName=com.mysql.jdbc.Driver
#数据库帐号
username=root
#数据库密码 等于号后面直接填密码,不需要引号,密码为空时可以不填或 ""
password=
#初始化连接池时,创建的连接数量
initialSize=5
#连接池的最大连接容量,连接使用完后不释放会很容易达到最大值,导致之后的连接被卡住
maxActive=20
#空闲时允许保留的最大连接数量
maxIdle=5
#空闲时允许保留的最小连接数量
minIdle=5
#排队等候的超时时间(毫秒)
maxWait=3000

3、DBCP使用

新增

public class DBCPTest {//全局变量private static DataSource ds = null;static {Properties ppt = new Properties();InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");try {ppt.load(is);ds = BasicDataSourceFactory.createDataSource(ppt);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {//文件的输入流InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");//将配置文件, 转换为Properties对象Properties ppt = new Properties();ppt.load(is);//通过连接池的工厂类(DruidDataSourceFactory)的创建连接池的方法(createDataSource())DataSource ds = BasicDataSourceFactory.createDataSource(ppt);//从连接池中 获取连接对象Connection conn = ds.getConnection();//通过连接对象,创建SQL对象Statement state = conn.createStatement();//通过SQL对象,执行SQL语句,以state.execute("insert into user value ('huang','123')");//释放资源conn.close();state.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞安籍侨领池万进荣任意大利瑞安同乡总会第五届会长

浙江温州瑞安是全国重点侨乡&#xff0c;拥有海外侨胞16万人、侨领2100多名、归侨侨眷近12万人&#xff0c;在世界100多个国家和地区建有70多个侨团组织。 意大利瑞安同乡总会第五届理事会会长团全体成员 青年部全体成员 各兄弟会长及代表 12月10日&#xff0c;意大利瑞安同乡…

【海报】新年海报 制作

准备一张写好文字的图片。 模型&#xff1a; 电商\lofi_v4.safetensors [9462506675] best quality,masterpiece,8k,(soft lighting:1.2),firecrackers,Chinese new year,<lora:全网首发丨新年红包封面_v1.0:1>, 虚假&#xff0c;不真实&#xff0c;绘画&#xff0c;线条…

关于“Python”的核心知识点整理大全27

目录 10.5 小结 第&#xff11;1 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名&#xff0c;在名和姓之间加上一个空格&#xff0c;并将它们的 首字母都大写&#xff0c;再返回结果。为核实get_formatted_name()像期望的那样工…

企业常用的高速数据传输方式

数据传输是指在计算机系统或网络中&#xff0c;将数据从一个设备或节点发送到另一个设备或节点的过程。数据传输的速度和质量直接影响企业的业务效率、竞争力和安全性。随着信息技术的不断发展&#xff0c;企业面临着越来越多的数据传输需求&#xff0c;因此需要选择适用的高速…

如何在使用Docker快速部署StackEdit并实现公网访问本地编辑器远程办公

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

多个文件如何快速单独生码?文件批量建码的方法及步骤

​如何将多个文件批量生成单独的二维码&#xff1f;当需要将word、excel、pdf、ppt等类型的办公文件经常会通过扫描二维码的方式来让其他人查看。那么当我们需要将每个文件生成一个二维码时&#xff0c;有什么方法能够快速的一键批量建码呢&#xff1f;下面给大家分享一招&…

如何搭建企业管理系统Odoo并远程访问管理界面【内网穿透】

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

ASP.NET MVC+EntityFramework图片头像上传

1&#xff0c;先展示一下整体的效果 2&#xff0c;接下来展示用户添加以及上传头像代码、添加用户界面 前端代码如下&#xff1a; <div class"form-group">Html.LabelFor(model > model.img, "头像&#xff1a;", htmlAttributes: new { class &…

MySQL job 定时任务

目录 介绍 优点&#xff1a; 缺点&#xff1a; 使用场景&#xff1a; 案例 创建表 -- 创建定时任务 每一分钟插入一条数据 执行结果 -- 查询定时任务 ENABLED--启用 DISABLED--禁用 -- 查询定时任务 -- 启用定时任务 ​-- 禁用定时任务 ​-- 删除定时任务 …

竞赛保研 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

案例分享,现代水墨风客餐厨装修。福州中宅装饰,福州装修

近年来&#xff0c;现代水墨风格越来越受到人们的青睐&#xff0c;它独特的韵味和精致的细节让人无法抗拒。今天我想要跟大家分享一下一款经典的水墨风客餐厨装修案例&#xff0c;希望可以给大家在家装方面提供一些灵感和参考。 设计亮点 01. 无主灯悬浮吊顶 这款客餐厨装修案…