Druid连接池和Apache的DBUtils
背景
jdbc连接数据库存在着大批量用户进行短时间的SQL连接操作的 需求,而普通用户连接后直接断开与数据库的连接,下次连接需要重新建立桥梁,再频繁访问时。这是很消耗性能的一个操作,因此诞生了数据库连接池技术。提前创建 一些连接,避免频繁的创建连接,并且可以管理程序和数据库之间的连接,动态分配桥梁给申请连接的应用程序。
Druid连接池
- Druid(德鲁伊)连接池是阿里开发的,据说是集DBCP、C3P0、Proxool优点于一身的数据库连接池。
一、如何使用Druid连接池
- 引入德鲁伊连接池jar包和jdbc驱动jar包(网上搜索一下,很容易找到下载,注意是.jar文件)
- 代码步骤:
- 第一步:建立一个数据库连接池对象
- 第二步:设置连接池的参数
- 第三步:从连接池中获取连接对象来使用
- 代码示例
@Testpublic void test1() throws SQLException {DruidDataSource ds = new DruidDataSource();//设置基本参数ds.setDriverClassName("com.mysql.cj.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/atguigu");ds.setUsername("root");ds.setPassword("123456");//设置其他连接参数ds.setInitialSize(10);//初始化连接数ds.setMaxActive(11);//最大活动连接数ds.setMaxWait(1000);//最大等待时间ds.setMinIdle(5);//最小连接数for (int i = 0; i < 30; i++) {DruidPooledConnection conn = ds.getConnection();System.out.println("conn = " + conn);conn.close();//释放连接到连接池中}}
二、封装Druid连接池
1.配置文件参数批量导入
Druid连接池提供了一个createDataSource(Properties prop)的方法来统一设置连接池的参数,由于底层是采用硬编码编写的,所以配置文件的变量名称必须与代码一致,否则无法将配置读取到项目中。
具体步骤:
- 读取配置文件的参数信息
- 使用工厂设计模式批量给参数赋值
- 创建线程池ds
- 调用线程的getConnection方法来获取一个连接
public class JdbcTool2 {private static DataSource ds;static {//1.注册驱动Properties prop = new Properties();try {//加载配置文件中的数据到Properties中//配置文件要放到src目录下prop.load(JdbcTools.class.getClassLoader().getResourceAsStream("jdbc.properties"));//批量设置参数的大小ds = DruidDataSourceFactory.createDataSource(prop);//Class.forName(className);} catch (IOException e) {throw new RuntimeException(e);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getConnection() throws SQLException {//获取连接return ds.getConnection();}
}
2.绑定连接对象
在MVC分层模型中,如果我们在DAO层中使用jdbc技术建立连接修改了账号表的数据,而在业务层中为了模拟转账的需求又再次获取了一个Connection对象来实现该事务。该写法会导致我们重复创建了不同的连接,并且当代码出现异常执行事务回滚时会发现不能恢复到原有的状态。这是由于两层代码中的连接对象并不是同一个。
解决方案如下:
- 在jdbc工具类中定义一个ThreadLocal对象
- 在静态代码块中将其实例化
- 获取连接时使用类似单例模式的写法来将连接与线程绑定在一起
public class JdbcTool3 {private static DataSource ds;private static ThreadLocal<Connection> threadLocal;static {//1.注册驱动Properties prop = new Properties();try {//加载配置文件中的数据到Properties中prop.load(JdbcTools.class.getClassLoader().getResourceAsStream("jdbc.properties"));//配置文件要放到src目录下//批量设置参数的大小ds = DruidDataSourceFactory.createDataSource(prop);//Class.forName(className);//3.创建线程threadLocal = new ThreadLocal<>();} catch (IOException e) {throw new RuntimeException(e);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getConnection() throws SQLException {//获取连接Connection conn = threadLocal.get();if(conn==null){conn = ds.getConnection();threadLocal.set(conn);}return conn;}public static void closeAll(ResultSet rs, Statement st, Connection conn){try {if(rs!=null){rs.close();}if(st!=null){st.close();}if(conn!=null){conn.close();//将连接还给连接池threadLocal.remove();//把连接对象从当前线程移除}} catch (SQLException e) {throw new RuntimeException(e);}}public static DataSource getDs(){return ds;}
}
示例代码
三、Apche的DBUtils
一个已经封装好了的工具类,可以简化我们在编写DAO层代码的复杂度。主要分两个方面来介绍一下该工具类,分别是增删改和查询操作。
1.update操作
简化之前的代码:
//添加用户public int addUser(User user) throws SQLException {Connection conn = JdbcTool3.getConnection();PreparedStatement pst = conn.prepareStatement("insert into users(username, password) values(?,?)");pst.setObject(1,user.getUsername());pst.setObject(2,user.getPassword());int i = pst.executeUpdate();JdbcTool3.closeAll(null,pst,conn);return i;}
使用DBUtils后的代码:
//添加用户public int addUser(User user) throws SQLException {String sql = "insert into users(username, password) values(?,?)";int update = qr.update(sql, user.getUsername(), user.getPassword());return update;}
2. query操作
简化之前的代码:
//根据id查询用户public User getUserById(int id) throws SQLException {Connection conn = JdbcTool3.getConnection();PreparedStatement pst = conn.prepareStatement("select id, username, password from users where id = ?");pst.setObject(1,id);ResultSet rs = pst.executeQuery();User user = null;if(rs.next()){int ID = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");System.out.print("ID = " + ID);System.out.print(",username = " + username);System.out.println(",password = " + password);user = new User(ID, username, password);}JdbcTool3.closeAll(null,pst,conn);return user;}
使用DBUtils后的代码:
public User getUserById2(int id) throws SQLException {String sql = "select id, username, password from users where id = ?";return qr.query(sql,new BeanHandler<>(User.class),id);}
其中query方法中的BeanHandler对象底层是通过反射的方式来动态的将对象创建出来,可以选择相应容器来包装,如果是单个字段的话,可以使用相应的Handle对象来处理。
相关文章:
Druid连接池和Apache的DBUtils
背景 jdbc连接数据库存在着大批量用户进行短时间的SQL连接操作的 需求,而普通用户连接后直接断开与数据库的连接,下次连接需要重新建立桥梁,再频繁访问时。这是很消耗性能的一个操作,因此诞生了数据库连接池技术。提前创建 一些连…...
怎样快速选择正确的可视化图表?
数据可视化的图表类型十分丰富,好的图表可以有效、清晰地呈现数据的信息。对于用户而言,选择正确的图表是十分关键的,不仅可以达到“一图胜千言”的效果,而且会直接影响分析的结果。 用户选择正确的数据可视化图表前,…...
6路液体水位检测芯片VK36W6D SOP16 抗电源干扰及手机干扰特性好
产品品牌:永嘉微电/VINKA 产品型号:VK36W6D 封装形式:SOP16/QFN16L 详细资料:13.5/5.474/4.703 概述 VK36W6D具有6个触摸检测通道,可用来检测6个点的水位。该芯片具有较高的集成度,仅需极少的外部组件便…...
【设备树笔记整理6】中断系统中的设备树
1 中断概念的引入与处理流程 1.1 中断处理框图 1.2 中断程序的使用 主函数() while(1) {do_routine_task(); }中断处理函数() {handle_interrupt_task(); }如何调用中断处理函数? 1.3 ARM对异常(中断)的处理过程 (1)初始化 ① 设置中断…...
微信小程序下载后端返回的文件流
downtest() {let temp {"title": ["排名", "车号", "车队", "车手", "领航", "赛段成绩", "距首车成绩", "距前车差距", "发车时间", "冲刺时间", "赛段…...
Autoware.universe部署04:universe传感器ROS2驱动
文章目录 一、激光雷达驱动二、IMU驱动2.1 上位机配置4.2 IMU校准4.3 安装ROS驱动 三、CAN驱动四、相机驱动4.1 安装驱动4.2 修改相机参数 五、GNSS驱动 本文介绍了 Autoware.universe 各个传感器ROS2驱动,本系列其他文章: Autoware.universe部署01&…...
Spring boot如何工作
越来越方便了 java技术生态发展近25年,框架也越来越方便使用了,简直so easy!!!我就以Spring衍生出的Spring boot做演示,Spring boot会让你开发应用更快速。 快速启动spring boot 请参照官网 Spring | Quic…...
代码随想录打卡—day45—【DP】— 8.29 完全背包应用
1 70. 爬楼梯(完全背包版) 70. 爬楼梯 完全背包装满的选法排列的套路,AC代码: class Solution { public:/*完全背包的思路:1 2是两个物体 可以无限取*/int dp[50]; // 能爬到第i楼的选法的排列数/*dp[j] dp[j - i];dp[0] 1fo…...
2023.8.28日论文阅读
文章目录 NestFuse: An Infrared and Visible Image Fusion Architecture based on Nest Connection and Spatial/Channel Attention Models(2020的论文)本文方法 LRRNet: A Novel Representation Learning Guided Fusion Network for Infrared and Visible Images本文方法学习…...
HAproxy(四十七)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 简介 1.2 核心功能 1.3 关键特性 1.4 应用场景 二、安装 1.内核配置 2.编译安装 3. 建立配置文件 4. 添加为系统服务 5. 添加3和5运行级别下自启动…...
Java实战场景下的ElasticSearch
文章目录 前言一、环境准备二、RsetAPI操作索引库1.创建索引库2.判断索引库是否存在3.删除索引库 二、RsetAPI操作文档1.新增文档2.单条查询3.删除文档4.增量修改5.批量导入6.自定义响应解析方法 四、常用的查询方法1.MatchAll():查询所有2.matchQuery():单字段查询3.multiMatc…...
拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆
2023年,中国改革开放迎来了45周年,改革春风浩荡,席卷神州大地,45年间,中国特色社会主义伟大事业大步迈入崭新境界,一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行,不仅使中国的经济…...
前端须知名词解释
目录 一、多维转一维 二、一维转多维 一维转多维——使用场景:分页 三、判断当前元素是否为数组 四、判断当前元素是否是空对象 五、数字分割符:提高数字可读性 六、模糊盒子(怪异盒子)与标准盒模型 七、css的filter属性 …...
React性能优化之memo缓存函数
React是一个非常流行的前端框架,但是在处理大型应用程序时,性能可能会成为一个问题。为了解决这个问题,React提供了一个称为memo的功能,它可以缓存函数并避免不必要的重新渲染。 memo是React中的一个高阶组件(HOC&…...
2023年高教社杯 国赛数学建模思路 - 案例:ID3-决策树分类算法
文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…...
C# Emgu.CV 条码检测
效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.CV.Util; using static Emgu.C…...
VueRouter的基本使用
路由的基本使用 文章目录 路由的基本使用01-VueRouterVueRouter的使用 ( 5 2)综合代码 拓展:组件存放问题 什么是路由呢? 在生活中的路由:设备和IP的映射关系 在Vue中:路径 和 组件 的 映射 关系。 01-Vu…...
网工笔记:快速认识7类逻辑接口
逻辑接口是指能够实现数据交换功能但物理上不存在、需要通过配置建立的接口。逻辑接口需要承担业务传输。 下面是我整理了7款常见的逻辑接口。 接口类型 描述 Eth-Trunk接口 具有二层特性和三层特性的逻辑接口,把多个以太网接口在逻辑上等同于一个逻辑接口&…...
MySQL中的free链表,flush链表,LRU链表
一、free链表 1、概述 free链表是一个双向链表数据结构,这个free链表里,每个节点就是一个空闲的缓存页的描述数据块的地址,也就是说,只要你一个缓存页是空闲的,那么他的描述数据块就会被放入这个free链表中。 刚开始数…...
mac使用VsCode远程连接服务器总是自动断开并要求输入密码的解决办法
在mac中使用vscode远程连接服务器,时常会出现自动断开并要求重新输入服务器密码的问题,接下来让我们来解决它: 1、首先,在本地创建公钥: ssh-keygen 这条命令执行之后,出现提示直接回车即可;直…...
测试自动化维护成本:如何实现50%降本增效
一、自动化测试维护成本的核心痛点 1.1 成本构成分析 脚本维护成本(占总成本60%-70%) 页面改版导致的元素定位失效(平均每次影响30%脚本) 业务逻辑变更引发的用例重构(单次维护耗时2-8小时) 环境维护成…...
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图)
从零开始玩转Arduino:手把手教你用MOS管和继电器控制大电流设备(附电路图) 当你第一次尝试用Arduino控制大功率设备时,可能会遇到一个常见问题:小小的开发板输出引脚根本无法直接驱动电机、灯带或加热管。这时候&#…...
cv_unet_image-colorization模型监控:推理延迟与成功率实时看板
cv_unet_image-colorization模型监控:推理延迟与成功率实时看板 1. 项目背景与监控需求 在实际的图像上色应用场景中,用户不仅关心最终的上色效果,更需要了解模型的运行状态和性能表现。特别是对于需要批量处理历史照片的用户来说ÿ…...
LVGL下拉列表控件lv_dropdown实战:从基础配置到高级定制(附完整代码示例)
LVGL下拉列表控件lv_dropdown实战:从基础配置到高级定制(附完整代码示例) 在嵌入式UI开发领域,LVGL(Light and Versatile Graphics Library)凭借其轻量级和高度可定制的特性,已成为许多开发者的…...
百度大模型二面:有微调过 Agent 能力吗?数据集如何收集?
1. 问题分析做 Agent 的团队很多,但真正动手微调过 Agent 能力的人并不多。大部分人停留在 Prompt 闭源 API 的阶段就基本上交差了,只有当你真的需要在开源模型上把 Agent 跑起来、或者对工具调用的稳定性有极致要求时,才会走到微调这一步。…...
2026最新大模型应用开发学习路线(附时间规划,小白/程序员必收藏)
一、先破局:初学者必看!Python 还是 Java 选对不踩坑 很多小白和入门程序员,刚接触大模型开发就卡在编程语言选择上,浪费大量时间纠结。不绕弯子,直接给结论,结合AI开发场景帮你精准选择,新手直…...
Nunchaku FLUX.1-dev 提示词工程入门:编写高质量Prompt的实用技巧与范例
Nunchaku FLUX.1-dev 提示词工程入门:编写高质量Prompt的实用技巧与范例 你是不是也遇到过这种情况:用同一个开源大模型,别人生成的图片精美绝伦,自己生成的却总差点意思,要么主体不对,要么风格跑偏&#…...
Qwen3-ForcedAligner与Node.js后端集成方案
Qwen3-ForcedAligner与Node.js后端集成方案 1. 引言 语音处理在现代应用中越来越重要,从语音识别到音频分析,都需要高效可靠的技术方案。Qwen3-ForcedAligner作为一个强大的强制对齐模型,能够精确地将文本与语音进行时间戳对齐,…...
华硕笔记本CPU过热?G-Helper降压调优终极指南帮你降温10℃
华硕笔记本CPU过热?G-Helper降压调优终极指南帮你降温10℃ 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…...
PyQt5实战:用QTreeView+QStandardItemModel快速构建你的第一个树形文件浏览器(附完整代码)
PyQt5实战:用QTreeViewQStandardItemModel快速构建你的第一个树形文件浏览器 每次看到电脑资源管理器左侧那整齐的目录树,你是否好奇过它是如何实现的?今天我们就用PyQt5的QTreeView和QStandardItemModel组件,从零开始打造一个简…...
