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…

【Spring连载】使用Spring Data的Repositories----定义Repository接口

【Spring连载】使用Spring Data的Repositories----定义Repository接口 一、微调Repository定义二、使用多个Spring Data模块的Repositories 要定义repository接口,首先需要定义特定于域(domain)类的repository接口。接口必须继承Repository&a…

8.openEuler操作系统网络管理和防火墙(二)

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 3.通过IP命令配置网络 配置IP地址: 使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名…

一文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设计思路,指令流共享,同时执行,数据切分成小块 …

四种主流的prompt框架

省流版: 文章介绍了在使用GPT时的四种prompt框架,有利于使用者打磨提问风格,与GPT进行更好的交互以提高生产力,能帮助大家有效提高工作效率~ 创作不易,如果对你有帮助的话,还请三连支持~ 想要使用Prompt…

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…

jQuery简介与解析 - 掌控网页互动的魔法工具

jQuery简介与解析 - 掌控网页互动的魔法工具 摘要:本文将带您了解jQuery这一强大且流行的JavaScript库,探讨其特点、优势以及如何在网页开发中发挥巨大作用。我们将从jQuery的基本概念入手,逐步深入解析其核心功能,助您轻松掌握这…

phpspreadsheet导出数据和图片到excel

仅作记录&#xff0c;废话不多说 前提是已经安装了phpspreadsheet &#xff08; composer require phpoffice/phpspreadsheet &#xff09; 一、 数据拼装&#xff0c;调用excel类 <?php /*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controlle…

Android 面试问题 2024 版(其三)

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

Shell echo、printf、test命令

目录 Shell echo命令 打印文本消息 显示变量值 输出特殊字符 输出到文件 追加到文件 Shell printf 命令 打印简单文本 Shell test 命令 文件测试 字符串比较 整数比较 逻辑运算 Shell echo命令 打印文本消息 echo "Hello, World!" 显示变量值 name&q…

积累:如何提取 int 数据的高低字节

前言 服务通信、硬件开发&#xff0c;一般都会涉及到字节数据的解析、处理。无论是两个服务间的数据交互协议&#xff0c;还是硬件设备的通信协议&#xff0c;协议中涉及到的参数比较多&#xff0c;并且协议中每个参数占用的字节大小设定会因功能也不尽相同&#xff1a;简单点的…

微信小程序(4)- 事件系统和模板语法

1. 事件系统 1.1 事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代…

抖店货源怎么找?这几个货源渠道,我都替你整理出来了!

我是电商珠珠 在开通抖店之后&#xff0c;怎么找货源成为了新手的致命要点。货源找不好&#xff0c;就会导致店铺的流量曝光不够。 抖店货源究竟该怎么找呢&#xff0c;今天我就来给大家说个明白。 1、货源网站 比较常规的方式&#xff0c;就是去货源网站上去找&#xff0c…