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

news2025/2/25 12:07:49

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获取value
			properties = 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.coloradmin.cn/o/1473920.html

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

相关文章

【Python笔记-设计模式】责任链模式

一、说明 旨在将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。 (一) 解决问题 将请求的发送者和接受者解耦,并使请求随着处理对象链传递,优化系统内部处理逻辑 (二) 使…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

shell的基本介绍

一. 什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程 序设计语言。shell是解释执行的。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问…

[c 语言] 大端,小端;网络序,主机序

在网络编程中,特别是底层网卡驱动开发时,常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序,高位保存在低地址还是高地址,以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性,常见…

视频如何无水印保存?这两个方法帮你一键保存

在互联网的浩瀚海洋中,我们时常会遇到那些令人心动、想要珍藏的视频。无论是教育资料、精彩瞬间,还是心仪的影片、综艺节目,我们都希望能够随时随地欣赏它们。然而,网络上的视频往往受到地域、平台、设备等多种限制,使…

数组指针。

数组指针:*先与数组名结合,后与方块结合。 指针数组:*先与方块结合。 int(*p)[5]和&arr的类型均为int(*)[5] &arr取出的是数组整个地址。&arr[0]与arr相同,是数组首地址。 一般在二维数组中使用数组指针 打印时要写…

StarRocks实战——多维分析场景与落地实践

目录 一、OLAP 系统历史背景 1.1 历史背景与痛点 1.2 组件诉求 二、StarRocks 的特点和优势 2.1 极致的查询性能 2.2 丰富的导入方式 2.3 StarRocks 的优势特点 三、多维分析的运用场景 3.1 实时计算场景 / 家长监控中心 3.2 实时更新模型选择 3.2.1 更新模型UNIQU…

动态规划的时间复杂度优化

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 优化动态规划的时间复杂度,主要有如下几种: 一,不同的状态表示。 比如:n个人,m顶帽子。 第一种方式:dp[i][mask] ,i表示前i个人已经选择帽子&…

安防视频监控平台EasyNVR级联视频上云管理平台EasyNVS,出现报错“i/o deadline reached”该如何解决?

上云网关管理平台EasyNVS视频综合管理系统具备汇聚与管理EasyGBS、EasyNVR等平台的能力,系统可以将接入的视频资源实现视频能力统一输出,并能进行远程可视化运维等管理功能,还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反…

【数据结构】栈OJ题《用栈实现队列》(题库+解析+代码)

1. 前言 通过前面栈的实现和详解大家对队列应该有一定熟悉了,现在上强度开始做题吧 栈详解:http://t.csdnimg.cn/9Fsbs 本体的做题思路也可以参考上一篇文章,就是有一点点不同。 用队列实现栈:http://t.csdnimg.cn/V2qjW 2. …

Connection模块类功能联调(整合三)

目录 概要 tcp_cli.cc tcp_srv.cc server.hpp 测试结果 第三次整合 概要 本主要是将以下模块进行整合测试 Connection管理类实现(模块六)-CSDN博客 EventLoop整合与TimerWheel联合调试(整合二)-CSDN博客 tcp_cli.cc #include "../source/server.hpp"int main…

大开眼界的4款黑科技软件,功能强大,网友:越用越上瘾

作为一名热衷于探索软件的搞机爱好者,小蛙在各大软件论坛间游走,旨在帮助大家在纷繁复杂的Windows软件世界中,寻找到那些真正值得安装的神器。 在忙碌的现代生活中,我们的磁盘空间和时间都显得尤为宝贵,没必要下一些鸡…

web网站怎么做压力测试

Web网站性能体现在并发用户数已经网站的吞吐量和时延。 最简单的压力测试工具就是ab "Apache Benchmark" 下面将介绍ab的安装和使用: 1. ab的安装 ab的安装非常简单,安装了httpd,就自带ab。 CentOS下的安装: yum install -y httpd …

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示: 表示docker正在运行中

云呐智能生产线安装与运维是做什么的?需要学哪些内容?

能生产线安装与运维主要负责智能化生产线的组装、接线、调试、辅助生产和运维等工作。  智能生产线安装与运维工作的核心在于保证智能生产线的高效运转和持续优化。具体来说,这个领域的工作人员需要掌握机械、电工电子技术、工业机器人等基础知识和技能&#xff0…

如何进行Appium实现移动端UI自动化测试?

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学…

亚信安慧AntDB助力全链路实时化

实时数据平台,快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念,通过实时数据应用平台来装载庞大的信息量,进行实时分析处理,克服数据处理过程中的困难,是当下各企事业单位、互联网、金融&#xff0c…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的,对于一个C/C库,可以用pybind11封装它的接口为Python接口,这样得到一个python库,就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此,使用pybind11做封装,是我…

Golang 实现 websocket 通讯(一个服务器,两个客户端)

运行客户端时首先要输入自己的名字,两个客户端输入的名字不能一样。 先上运行结果: 服务器端: 客户端1: 客户端2: 话不多说,直接上代码: 服务器端: package mainimport ("f…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低:在停等协议中,发送方在发送完一帧后必须等待接收方确…