MySQL-事务,properties文件解析,连接池

1.事务机制管理

        1.1 Transaction事务机制管理

        默认情况下是执行一条sql语句就保存一次,那么比如我们需要三条数据同时成功或同时失败就需要开启事务机制了。开启事务机制后执行过程中发生问题就会回滚到操作之前,相当于没有执行操作。

        1.2 事务的特征

                事务具有四个基本特性,通常称为ACID特性,分别是:

                原子性(Atomicity):原子性指的是事务是不可分割的最小执行单元。事务中的所有操作要么全部提交成功,要么全部失败回滚,不存在部分提交或部分回滚的情况。原子性确保了数据库在执行事务时的完整性,即要么所有操作都成功,要么都不影响数据库状态。

                一致性(Consistency):一致性指的是事务执行前后,数据库的状态必须保持一致。事务执行过程中可能改变数据库中的数据,但是这些改变必须满足数据库定义的所有约束和规则,确保数据库从一个一致性状态转换到另一个一致性状态。

                隔离性(Isolation):隔离性指的是并发执行的多个事务之间是相互隔离的,一个事务的执行不应该受到其他事务的影响。隔离性保证了每个事务在执行时都拥有独立的数据空间,不会互相干扰,避免了并发事务之间的数据竞争和不一致性问题。

                持久性(Durability):持久性指的是一旦事务提交成功,其所做的修改将永久保存在数据库中,并且不会因系统故障而丢失。即使系统崩溃或断电,已提交的事务对数据库的修改也应该被永久保存。持久性确保了数据的可靠性和持久性,是数据库系统的重要特性之一。

                这些特性确保了事务在数据库中的可靠性、一致性和完整性,是数据库管理系统实现数据管理和控制的基础。

        1.3 事务处理操作
public class JDBC_Transction {public static void main(String[] args) {// noTransaction();useTransaction();}// 未使用事务// 当第二个sql语句有错误时,一三语句同样会执行public static void noTransaction() {Connection conn = null;Statement statement = null;try {conn = DBUtil.getConnection();statement = conn.createStatement();statement.addBatch("insert into user(name,password,nickname) values('test1',111,'用户1')");statement.addBatch("insert into user(name,pass,nickname) values('test2',222,'用户2')");statement.addBatch("insert into user(name,password,nickname) values('test3',333,'用户3')");statement.executeBatch();System.out.println("添加成功");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {DBUtil.close(statement);DBUtil.close(conn);}}// 使用事务// 第二句sql语句有错,第一三条数据也不会执行public static void useTransaction() {Connection conn = null;Statement statement = null;try {conn = DBUtil.getConnection();statement = conn.createStatement();// 关闭自动提交,开启事务conn.setAutoCommit(false);statement.addBatch("insert into user(name,password,nickname) values('test1',111,'用户1')");statement.addBatch("insert into user(name,pass,nickname) values('test2',222,'用户2')");statement.addBatch("insert into user(name,password,nickname) values('test3',333,'用户3')");statement.executeBatch();// 执行完成后,提交并开启自动提交conn.commit();conn.setAutoCommit(true);System.out.println("添加成功");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();// 执行到这里说明有错if (conn != null) {try {// 事务回滚,回到操作之前的状态// 同时删除操作对应的缓冲区中的数据conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}}} finally {DBUtil.close(statement);DBUtil.close(conn);}}}

        2.Properties优化硬编码

public static Connection getConnection() throws ClassNotFoundException, SQLException{Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/_day_02","root", "abc280619SS");return conn;}

        如上代码,我们项目开发完成测试通过后,通常是要打包发布给别人使用的,如果我们把一些配置信息写死到代码中(这种行为叫硬编码,hardcode),别人就无法修改了

        比如别人使用的MySQL服务器对应的IP是10.0.0.1,端口号是9300,用户名是mysqluser、密码是123456。

        那么我们只能改代码再重新打包发布,如果有多个用户,他们对应的配置信息都不同,那么我们要针对不同的用户打包发布多次。

        以上显然是没必要的,因为我们开发的是程序,只要业务需求/逻辑不变,我们就无需多次打包发布。对此我们的解决方案是,尽量避免硬编码,      将数据与程序分离解耦,将配置信息存储到配置文件中,程序运行时读取配置文件,不同用户只需按自己的实际情况修改配置文件即可。

        2.1 创建jdbc.properties文件

这种方式下,账号密码发生变动时,只需要更改配置文件中的内容即可。

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/_day_02
username=root
password=root
        2.2 创建PropertiesUtil
public class PropertieUtil {private static Properties properties = null;static {try {// propertie 本质就是一个map,可以通过key获取valueproperties = new Properties();properties.load(Properties.class.getClassLoader().getResourceAsStream("jdbc.properties"));} catch (Exception e) {e.printStackTrace();}}// 提供获取value的方法public static String get(String key) {return properties.getProperty(key);}
}
        2.3 更改DBUtil工具类
public class DBUtil_00 {// 封装方法加载驱动创建链接public static Connection getConnection() throws ClassNotFoundException, SQLException{// 通过PropertiesUtil获取配置文件中的值Class.forName(PropertieUtil.get("driver"));String url = PropertieUtil.get("url");String username = PropertieUtil.get("username");String password = PropertieUtil.get("password");Connection conn = DriverManager.getConnection(url,username,password);return conn;}// 封装方法关闭资源public static void close(AutoCloseable obj) {if (obj != null) {try {obj.close();} catch (Exception e) {e.printStackTrace();}}}
}

        3. 连接池

        3.1 介绍

                数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

                释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

                这项技术能明显提高对数据库操作的性能。

        3.2 应用场景

                场景一:电商网站如淘宝,京东的双十一活动,同一时刻会有上亿甚至上十亿的用户访问数据库。

                场景二:某服务器上除了运行MYSQL服务,还有其他一些服务比如WEB服务。我们知道,数据库连接的创建维持不只消耗我们客户端(个人PC)的系统资源(CPU、内存、IO设备),更消耗服务器的系统资源,而假如我们在周末时并不会去访问数据库,这时候服务器上依然还维持着一条空闲的连接,假设占用了2M内存,现在服务器上内存已经都被分配出去了,WEB服务却要求新申请1M内存,很显然,由于内存不足,WEB服务就无法正常运行了。

                以上两种情况下,如果只使用上面的代码是无法支持的。连接池的引入,则主要解决了以上两类问题:

                1. 能给多用户分配链接或给一个用户分配多个链接

                2. 在适当的时候回收空闲链接以节省系统资源

                

                JDBC连接池有一个对应的接口javax.sql.DataSource。它也是一个标准一个规范,目前实现了这套规范的连接池产品主要有:DBCP(MyBatis通常使用这个连接池)、C3P0(Hibernate通常使用这个连接池)、JNDI(Tomcat的默认连接池)。

                以DBCP为例:

                DBCP内部提供了一个“池子”,程序启动的时候,先创建一些连接对象放到这个池子中,备用,当调用连接池的getConnection()方法时,就从池子取出连接对象分配给多个用户/线程。使用完毕调用close()方法时,DBCP重写了close方法,它并不真正关闭连接,而是返还到池子中,由DBCP自动管理池子中的连接对象,在适当的时候真正关闭这些连接。

        优点 :

        资源复用 : 数据库连接得到重用,避免了频繁创建释放链接引起的大量性能开销,在减少系统消耗的基础上,也增进了系统运行环境的平稳性

        更快的系统响应速度 : 数据库连接池在初始化过程中,往往就已经创建了若干个数据库连接对象放到池中备用。这时,连接的初始化工作已完成,对于业务请求处理而言,直接利用现有的可用连接,避免了数据库连接初始化和释放过程的时间,从而缩减了系统整体的响应时间

        统一的连接管理,避免数据库连接遗漏 : 在较为完备数据库连接池中,可以根据预先的连接占用超时设定,强制回收占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露情况

        因为连接池组件不是JDK自带的,所以要导入相关jar包,DBCP相关的吉安人、

包有三个,如下:

        3.3 创建连接池工具类
public class BasicDataSorceUtil {private static BasicDataSource basicDataSource;// 为了解决高并发的问题,使用线程安全的单例模式,以双重锁校验的懒汉模式为例// 提供获取线程池对象的方法public static BasicDataSource getBasicDataSource() {if (basicDataSource == null) {synchronized (BasicDataSource.class) {if (basicDataSource == null) {basicDataSource = new BasicDataSource();basicDataSource.setDriverClassName(PropertieUtil.get("driver"));basicDataSource.setUrl(PropertieUtil.get("url"));basicDataSource.setUsername(PropertieUtil.get("username"));basicDataSource.setPassword(PropertieUtil.get("password"));}}}return basicDataSource;}
}
        3.4 测试线程池链接
// 使用数据库连接池
public class DBUtil_01 {public static void main(String[] args) throws SQLException {// 获取连接池对象BasicDataSource bds = BasicDataSorceUtil.getBasicDataSource();// 通过连接池获取链接对象Connection conn = bds.getConnection();PreparedStatement ps = conn.prepareStatement("insert into user(name,password,nickname) values('test4',444,'用户4')");ps.executeUpdate();ps.close();conn.close();}
}

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

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

相关文章

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息,并且队列内部是有序的。简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点: 订单在十分…

Anaconda下安装torch-geometric

主要流程参考:https://blog.csdn.net/weixin_45671036/article/details/130617637 https://blog.csdn.net/weixin_43756314/article/details/130225038?ops_request_misc&request_id&biz_id102&utm_term%E5%80%9F%E5%8A%A9anaconda%20%E5%AE%89%E8%A3%…

配置vscode,使其可以运行C++11特性的代码(如vector)

配置vscode,使其可以运行C11特性的代码 封面引用自配置教程的B站视频,非常详细的视频,感谢视频作者的贡献。 文章目录 配置vscode,使其可以运行C11特性的代码Step 1: 基础配置Step 2: 调整Code Runner的配置Step 3: 更改tasks.jso…

一文7个步骤教你搭建测试web测试项目实战环境

​今天小编,给大家总结下web 测试实战的相关内容,一起来学习下吧! web项目实战可按顺序依次为:【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志,redo日志的功能就是把增删改操作都记录着,如果断电导致内存中的脏页丢失,可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性,undo日志设计出来是为…

AI 绘画:人工智能绘画之美

人工智能(AI)是当今科技领域的热门话题,它不仅可以帮助我们解决各种复杂的问题,还可以创造出令人惊叹的艺术作品。AI 绘画是一种利用 AI 技术生成图像的方法,它可以模仿不同的风格、主题和技巧,甚至可以创造…

Qt Linux下调用OpenGL的glu.h报错:error: GL/glu.h: No such file or directory

Qt Linux下调用OpenGL的glu.h报错:error: GL/glu.h: No such file or directory 引言一、问题描述二、解决方案三、解决过程记录3.1 定位问题3.2 尝试使用yum命令安装3.3 从网上下载到本地进行安装 引言 在Windows上正常运行的OpenGL程序,到Linux下突然…

cuda学习笔记(2)

一 专业名词 1 分支断定 2 一致性和同一性 3 常见名词汇总 4 加速比 二 GPU架构构述 GPU就是将cpu的数据存储单元去掉,也就是保留执行单元,GPU就是多个执行单元 1 GPU设计思路,指令流共享,同时执行,数据切分成小块 …

MySQL的21个SQL经验

1. 写完SQL先explain查看执行计划(SQL性能优化) 日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。 explain select userid,name,age from user where userid =10086 or age =18;2、操作delete或者update语句,加个limit(S…

Android 面试问题 2024 版(其三)

Android 面试问题 2024 版(其三) 十一、版本控制十二、Play 商店和应用程序部署十三、无障碍十四、第三方库和 API十五、解决问题的能力十六、基于 JD 的非常高级别的问题 十一、版本控制 什么是版本控制,为什么它在软件开发中很重要&#x…

爬某网站延禧宫率第一集视频

import requests import re from tqdm import tqdm # 网址链接:https://v.ijujitv.cc/play/24291-1-1.html url https://v6.1080pzy.co/20220801/urxniJCN/hls/index.m3u8 headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下: N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…

Linux调用可执行程序:system()函数和execl函数

system()函数: system()函数是一个在C/C编程语言中的库函数,用于在操作系统中执行命令。 函数声明如下: int system(const char *command);该函数接受一个指向以空字符结尾的字符串的指针作为参数,该字符串包含要执行的命令。函…

吴恩达deeplearning.ai:sigmoid函数的替代方案以及激活函数的选择

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 引入——改进下需求预测模型ReLU函数(整流线性单元 rectified linear unit)线性激活函数(linear activation function)激活函数的选择实现方式为什么需要激活函数 到现在…

【MATLAB】 LMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 LMD分解算法 LMD (Local Mean Decomposition) 分解算法是一种信号分解算法,它可以将一个信号分解成多个局部平滑的成分,并且可以将高频噪声和低频信号有效地分离出来。LMD 分解算…

【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was

一、问题描述: error:Kotlin:module was compiled with an incompatible version of kotlin the binary version of its metadata is二、问题原因: jar包版本冲突 三、解决方式: 1、Rebuild Project(推荐☆) 重新构…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置,并启动软件添加线程组配置线程并发数添加Http取样配置取样,并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

Vue+SpringBoot打造高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Linux浅学笔记04

目录 Linux实用操作 Linux系统下载软件 yum命令 apt systemctl命令 ln命令 日期和时区 IP地址 主机名 网络传输-下载和网络请求 ping命令 wget命令 curl命令 网络传输-端口 进程 ps 命令 关闭进程命令: 主机状态监控命令 磁盘信息监控&#xff1a…

el-table样式问题:如何修改element-ui表格中按钮悬浮显示但是被el-table溢出隐藏的问题?

最近在写elment-ui样式表格中遇到了溢出隐藏的问题 修改前 修改后 是由于el-table__body-wrapper为 overflow:hidden导致的 解决方式: .el-table__body-wrapper {overflow: visible !important; } //或者 /deep/.el-table__body-wrapper {overflow: v…