百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

JavaEE概述总结:Servlet生命周期+JSP内置对象

csdh11 2025-04-08 13:15 13 浏览

前言

Servlet生命周期

JavaEE_01lifecycle学习任务:
	浏览器的任务:请求,处理,响应
	servlet任务:接收请求,通过对应的java代码处理请求,处理之后对其发出响应
	servlet由服务器创建,是单例的
	项目发布:
		tomcat集成进来注意:1,添加tomcat2,配置D:\Program Files (x86)\apache-tomcat-9.0.33\webapps
						卸载:1,Delete 2,Servers文件夹3,server-->Runtime environment 删除对应的tomcat
		1.手动发布 (实地项目)
			在eclipse导出web功能为一个war文件
			将war文件复制到 tomcat/webapps/ 目录下 启动tomcat
			访问:ip+端口/项目名/文件
		2.自动发布(开发项目)
			在eclipse中集成tomcat
			修改文件后,会自动将文件更新到服务器上
	服务器的生命周期:由服务器创建servlet对象
		前提:	在继承HttpServlet时,必须关联进tomcat
		重写构造方法以及inti,service,destroy方法
			构造方法和init在实例化对象时只被加载一次,
				加载方法: 默认为负数,在第一次加载时实例化对象 1.在第一次实例化时被创建-1
						通过在web.xml中配置,大于等于零时,在服务器启动时一并加载2.在服务器启动是被创建0
			service在每一次请求时被加载--->doGet()或doPost()
			destroy在该对象被摧毁时或服务器关闭时执行
		客户端访问浏览器:
			1.在web.xml中配置servlet文件(将servlet注册到服务器中)
			2.通过注解如:@WebServlet(name="saveUserServlet",urlPatterns="/saveUser")
				都可以为servlet配置多个访问路径
		访问404为路径错误

ServletContext和ServletConfig对象:

JavaEE_ServletConfigContext学习任务:
	服务器在创建Servlet对象时,会将当前Servlet配置的初始化参数封装到ServletConfig对象中
		一个servlet中对应一个ServletConfig,自己使用,别人不能用到
	由init()方法通过ServletConfig进行初始化操作:
		// 获得Servlet对象名
			System.out.println(config.getServletName());
		// 通过键的名字获得值
			String value =config.getInitParameter("name");
		// 获得所以参数名称的集合
			Enumeration names = config.getInitParameterNames();
	在web.xml文件中Servlet中配置有
		0
		1
			这样都是在服务器启动时加载,只是数字小的先执行,这里就是通过设置来进行测试,而不是通过配置路径访问测试
	ServletContext全局变量,一个应用程序有一个
		getInitParameter("name")获得当前应用的初始化参数
		setAttribute("attrname",value) 设置ServletContext属性并赋值
		getAttribute("attrname") 获得ServletContext属性指定值
		removeAttribute("attrname") 删除ServletContext指定属性
		getRealPath(filename)获得文件的绝对路径
		getContextPath()获得当前应用的根目录

HttpServletRequest以及HttpServletResponse对象

JavaEE_Http学习任务:
	在servive()中已经有doGet()和doPost()方法只是选择请求的方式而已。
	请求:
		get请求:
			1,在地址栏直接输入地址
			2,超链接请求
			3,method="get"
			4,window.open("url");
			5,location.assign("url");
			6,location.replace("url");
		post请求:
			表单method="post"
		当get请求不能响应时,就报405错误
	获得客户端的数据:
		注意字符集编码-->request.setCharacterEncoding("UTF-8");其实查看JSP源码会发现在try开始就设置了字符集
		通过参数名获得对应的值:
			单值:String request.getParameter("name");
			多值:public java.lang.String[] getParameterValues(java.lang.String name);
	获得请求头信息(更多查询API):
		request.getLocalPort()// 客户端端口(获得tomcat端口)
		System.out.println(request.getPathInfo()// 信息路径
	对客户端做出响应:
		注意设置字符集编码-->response.setContentType("text/html;charset=utf-8");
			response.setHeader("content-type","text/html;charset=utf-8");
			response.setCharacterEncoding("UTF-8");
			response.setContentType("text/html");
		通过HttpServletResponse响应获得到getWrite()输出流
			PrintWriter out = response.getWriter();
		write和print的区别:
			print底层实现是write,即print的功能更强。
			响应都可以解析html标签。
		注意如果直接通过response这种方式响应客户端,响应后页面的路径就是该servlet的路径
		(就是通过out.write()输出的内容是显示在页面上,该页面的路径就是servlet的路径)

Jsp与servlet的区别

JavaEE_04JSP学习任务:
	JSP的本质就是servlet,在运行jsp文件时,必须有服务器(tomcat等)的关联
		在项目中新建一个jsp文件,用服务器运行后在服务器的work目录下观察其源码:
			本机源码路径:D:\Program Files (x86)\apache-tomcat-9.0.33\work\Catalina\localhost\JavaEE_04JSP\org\apache\jsp
		观察源码发现jsp文件其实是一个类名为命名_jsp本项目中名字为:index_jsp;login_jsp
			但是更多的我们发现其实该类还继承和实现了
				extends org.apache.jasper.runtime.HttpJspBase
	    	 			implements org.apache.jasper.runtime.JspSourceDependent,
	                 			org.apache.jasper.runtime.JspSourceImports
	        在往下观察其实我们所写的jsp代码嵌套在try……catch中,而且是通过响应字符流的形式输出
	     	out.write("hello jsp\r\n");
	 对JSP文件的编码以及格式进行设置:
			编码:Window-->Preference-->Web-->JSP Files-->修改即可
			格式:Preference-->Web-->JSP Files -->Editor-->Templates-->New JSP File(html) --> Edit-->修改即可
	JSP的注释:
		不会被编译且不会再页面源码中显示:<%-- -->
		会被编译且可能运行在页面源码中显示:
		会被编译但不会out.write()不会再页面源码中显示:<%>

JSP的概述以及内置对象

JavaEE_05Include学习任务:
JSP概述:
	语法:<%@>
	page指令:language="java"编译使用的语言
			contentType="text/html; charset=UTF-8" 设置响应内容编码
			pageEncoding="UTF-8" 页面编码
			import="java.util.Date" 导入外部包中的类
    		errorPage="500.jsp" 当页面出现异常时,指向提示页面
    		isErrorPage="false" 是否报错页面,默认为true
    		session="false"  如果设置了,则该页面将不能使用session,默认为true
	include:
		不管静态包含还是动态包含,被包含的能用父类的变量(数据),但是父类不能用多包含对象中的变量(数据)
		<%@ include file='includeOne.jsp'>
			静态包含:在编译期间就将两个文件整合为一个.java文件,被包含的将不能被访问。这样两个jsp文件就能共享变量(数据)。
			当访问被包含的文件时,报错HTTP Status 500 – Internal Server Error
			其实被包含的.java文件是存在的,但是编译整合之后只有一个.class文件
			源码:	out.print((new StringBuilder("目标页面includeOne")).append(num).toString());
		
			动态包含:编译为两个独立的.java文件,及都能访问到。在运行时将被包含的内容包含进来,之间不能共享变量(数据)。
			源码:JspRuntimeLibrary.include(request, response, "includeTwo.jsp", out, false);
	九大内置对象:就是在JSP页面直接使用的对象
		(在500.jsp页面中添加isErrorPage="true",能够观察到九大内置对象)
		request,response,pageContext,
		session,exception,application,
		config,out,page,
	重定向(response)以及请求转发(request)
		其实是本质的可以通过out.print("");
		重定向(Status为302):重新定向地址栏中的地址。地址栏中地址变化
			整个过程有两次请求响应。(通过request设置参数可证明)
				这就造成了重定向不能通过request带参数,但是可以通过session带参数,而且不能访问WEB-INF目录下的文件。
		转发:
			整个过程一次请求响应。(通过request设置参数可证明)
	session :客户端和服务器间的对话。
		第一次访问网页时会生成一个SessionID号,用session.isNew()观察
		第二次之后再次访问服务器,会产生一个Cookie
		同一浏览器用同一个session对象,可以用在不同的页面中,也是每个浏览器的唯一标识
		context,request,session都拥有setAttribute(),getAttribute(),removeAttribute()
			session:存储同一个会话中共享的数据,在同一个会话中不同页面中获得用户信息。
			如果只用一次,或者请求一次,就将属性放在request中即可。(弄懂每个对象的使用范围)

Session对象

JavaEE_06session学习任务:
	session的生命周期:
		创建:
			1,第一次打开浏览器,访问服务器成功,由服务器在服务器端创建。
				session对象存储在浏览器端,将id号响应到浏览器中。
			2,客户端Id号存在,但服务器端session会话销毁,当再次发起请求时服务器就会再次创建session对象。
		设置session对象的非活动时间:
			/* 设置session的非活动时间以秒为单位 */
				session.setMaxInactiveInterval(5);
			
			  
			  	10
			  
		销毁:
			错误源:会话结束,浏览器关闭,session对象不会销毁。因为sessioin对象存储在服务器中,浏览器关闭,服务器并不知道。
				浏览器关闭本地sessionID号销毁,再次打开浏览器请求,就是一次全新的请求,服务器会生成新的session对象。
					可以理解为只有一个User,但是可以new多个对象使用。--->一个session会话,可以有多个session对象
			1,当session长时间(默认30分钟)不被使用时,session对象会被服务器销毁
				将当前的session对象发送个服务器,服务器其实已经将与之对应的session对象销毁,就没有与之对应的sesssionId,就会重新创建一个对象。
			2,服务器关闭session会话销毁。
				但是服务器tomcat会在关闭时,将session对象序列化缓存session对象。生成SESSIONS.ser文件,在启动服务器时再读取回来,SESSIONS.ser文件消失。
				SESSIONS.ser文件本机位置:D:\Program Files (x86)\apache-tomcat-9.0.33\work\Catalina\localhost\JavaEE_05Include\org
				可以通过配置让服务器不缓存服务器对象。在Server文件夹中的context.xml将下面注释放开 
					
				    	
				当服务器关闭时间超过最大时间时,直接销毁。同理,客户端有ID,而服务器已经销毁。
			3,安全退出时,强制销毁session会话。
				session.invalidate()
	ServletContext ---> application对象
		应用于整个程序,且整个应用程序共享的唯一一个对象,这就可以在不同的浏览器中获得的application对象都是相同的。
		在application对象中添加参数,这样在不同浏览器,不同页面,不同会话都能拿到该参数值。
		生命周期:创建于服务器 启动 结束语服务器关闭。
	pageContext---> 每个jsp网页都对应一个pageContext对象
		其他页面不能共享该页面数据
	exception --->在错误提示页面设置isErrorPage="true"在其body中<%>
		出错页面设置errorPage="500.jsp",设置错误提示地址,如果当前页面出现异常,会通过errorPage="500.jsp"转发(地址栏不变).
		注意一点测试异常时不要在Eclipse内置浏览器中测试,测试不出效果。

Cookie对象以及过滤器

  • 向需要Cookie页面时注意不要用请求转发,没效果。
  • 注意在判断是否选中记住密码复选框时不能通过.equals(""),会出现null异常
JavaEE_07Cookie学习任务:
	Cookie是保存在客户端的小文本。
		
	Cookie的作用:从服务器端向客户端响应的一些信息。
		临时存储在浏览器的内存中,浏览器关闭,数据就不存在了。
		可以通过设置有效时间,保存在电脑硬盘上,到期后自动删除。
	设置有效时间之后,之后的每次请求,浏览器都会将Cookie的数据发送,那么我们就能在服务器端获取Cookie数据。
		从页面请求中获得值,检查是否保存密码,是则给Cookie有效时间,否则不执行。
			if(userName != null && password != null){
						/*判断记住密码复选框是否已选*/
						if(inform != null){
							/*Cookie是通过键值对的形式存储数据*/
							Cookie cok = new Cookie("acc", userName);
							Cookie sok = new Cookie("pas", password);
							
							/*设置时间以秒为单位*/
							cok.setMaxAge(60);
							sok.setMaxAge(60);
							
							/*添加Cookie对象到response对象中,最终响应给浏览器*/
							response.addCookie(cok);
							response.addCookie(sok);
						}
		通过过滤器,在每次重定向时或其他请求时检查Cookie,注意不要用请求转发,没效果。
		值得注意的是,在过滤器中,request与response是ServletResponse类型,而获取Cookie需要HttpServletRequest类型需要强制类型转换。
			/* 通过过滤器设置Cookie,在返回页面,让页面拿到Cookie值,注意配置过滤器地址只能在登录页面 */
				Cookie[] cookies = req.getCookies();
				String acc = "";
				String pas = "";
				if(cookies != null){
					for(Cookie cookie : cookies){
						if(cookie.getName().equals("acc")){
							acc = cookie.getValue();
						}
						if(cookie.getName().equals("pas")){
							pas = cookie.getValue();
						}
					}
				}
		1.在配置文件中配置过滤器
			
			  	cookie
			  	com.wenhua.project.util.CookieFilter
			
			
			  	cookie
			  	/Login.jsp
			
		2.在过滤器中进行注解配置
			@WebFilter(urlPatterns="/Login.jsp")
	Session 和 Cookie的区别:
		session保存在服务器端,cookie保存在客户端
		session保存的是任意对象,值为Object,cookie保存的是字符串,值只能是字符串,tomcat9.0之后可以保存中文
		session生命周期结束后,信息随之也消失,cookie可以长期保存在客户端硬盘上,也可以临时保存在浏览器内存中(关闭浏览器,信息消失)。
	过滤器:
		作用:设置字符集,限定某些用户的浏览页面范围,输出日志。
		创建一个类实现接口Filter--->重写doFilter(request,response,chain)方法--->执行语句+chain.doFilter(request,response)
		在web.xml中配置以及要过滤文件的路径,初始化需要的参数(能在配置中进行配置在servlet中通过init()方法获得的初始化数据,就不要在servlet中定义)
		其实通过过滤器时,我们可以更直观的发现原来在重定向时发起的两次请求,会经过两次过滤器(本例中为登录页面用户密码不正确时,重定向500.jsp页面)
	论配置文件的重要性,1,配置文件不会被加载为.class文件,而当.java文件修改后,只有重新发布项目。
		1.配置文件不会加载为.class文件2.配置参数比较集中(不需要找地方)容易更改
	注意在<script>不要使用<%>,在过滤器中要强制转换类型为HttpServletRequest和HttpServletResponse
			function sessionInvalidate(){
				var result=confirm("是否退出当前用户!");
				if (result){
				
					location.replace("login");
					<%-- <% javajsp jsp session.invalidate request.getrequestdispatcherlogin.jsp.forwardrequest response> --%>
				}
			}
		注意在servlet中可以通过设置多个地址,判断地址后缀的形式,进行分开处理。

监听器的作用以及用处

JavaEE_08Listener学习任务:
	监听器:用于监听某些对象的事件。
			用来观察各对象的生命周期很完美。
		注意要在web.xml中进行配置,或者通过注解。
	ListenerServlet监听的是对象创建与销毁:
			通过监听器可以发现,session对象在浏览器关闭后,不会session并没有销毁。
			当通过session.invalidate()主动销毁session会话时,会发现原来以前创建的对象都会销毁。
	ListenerAction监听的是对象属性的添加,修改,移除:
			会发现原来,只有第一次是添加属性,往后都是在原来的name上修改属性。
		如果第一次访问时请求的时间肯定是比较大的,当关联数据库之后:servlet处理,加载数据库驱动,执行sql语句
			1,可以通过在web.xml配置文件中
			2,在注解中进行加载时间的配置loadOnStartup=0(和web.xml配置数字同理)

EL表达式以及jstl标签

JavaEE_09EL_jstl学习任务:
		EL是什么?
				EL即Expression Language(表达式语言)
				简化在JSP开发中对对象的引用,规范代码,增强程序的可读性,可维护性。
			有什么用?
				替代JSP页面中复杂的代码
			语法:以${}形式
			特点:得到数据,自动转换数据类型,输出
			注意:
				empty可以检测null,""都为true
				如果在EL表达式中发现为null,就不会输出
				引用对象的.运算符,其实也是通过getXxx()方法得到属性的值
				隐式对象,详情看EL.jsp
			缺点:EL表达式主要用于获得域对象中的属性值,但是数组,集合el表达式是不能循环处理的
            EL获取对象其实是在众多对象以特定的顺序
				pageContext--->request--->session--->application(不要在内置浏览器中测试)
			但是在业务复杂时,难免会出现想相同名字的属性,这就导致顺序靠后的拿不到值,所以有
				设置改变获得的顺序pageScope,requestScope,sessionScope,applicationScope。
				限定取值${applicationScope.name }
		jstl是什么?
			JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
			实现JSP页面的逻辑处理
			使用:
				环境搭建:1,导入标签库,在lib目录下
                    2,在JSP页面添加taglib指令
                    3,使用JSTL标签
			核心标签:<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'>
				迭代标签:forEach,forTokens
					items-->指定要遍历的集合或数组对象
					var--->指定集合内数据的变量名称
					begin-->指定从集合的第几位开始
					end-->指定迭代到集合的第几位结束
					step-->指定迭代的步长(增量)
                    varStatus="i"--> ${i.index}/${i.count}
					(forToKens专属)delims-->指定分割字符的分隔符
				条件标签:if,choose
					test="${}"----> 条件判断  返回 true/false  成立执行标签体内容,否则不执行
					var=""----> 声明一个变量  用于接收test结果
					scope="request" ----> 用来指定 变量存放的作用域
				  以下两个标签只能用在标签中
					
					
				通用标签:set,remove,out(基本不用)
					注意out中有个默认设置,当获取的值为空时,就显示
			时间标签:<%@ taglib uri='http://java.sun.com/jsp/jstl/fmt' prefix='fmt'>
				

异步请求:Ajax

读者福利:转发+关注 私信【学习笔记】获取小编整理好的Java知识点学习笔记一份。

JavaEE_10Ajax学习任务:
	ajax:Asynchronous JavaScript and XML
		使用ajax可以做到不刷新页面而刷新页面内容,通过异步与服务器端的交互方式,提高了用户体验度。
	实现:使用浏览器提供的一个XMLHttpRequest对象,异步向服务器发送请求。
		服务器返回部分数据,数据封装到XMLHttpRequest对象中(js),对网页做局部更新。
	1.编写jsp页面,事件处理
		1,创建XMLHttpRequest对象
		2,封装XMLHttpRequest对象
			建立连接open("get/post",url,true);
			发送请求send(null(get)/parameter(post))
		3,接收从服务器端响应回来的内容
			onreadystatechange事件,是在向服务器端发送请求后触发,接收服务器端返回的数据
			状态就绪码:readyState
			状态码:status
			responseText 得到返回的数据
	2.在servlet中对事件进行处理
		通过PrintWrite输出
	3.对servlet在web.xml中对servlet进行配置或通过注解进行配置
	4.    Ajax1.jsp以及相关是同步请求测试
		  Ajax2.jsp以及相关是异步请求测试
		  Ajax3.jsp为Ajax2Servlet的post请求
		  	setRequestHeader("content-type","application/x-www-form-urlencoded")设置请求头
注意使用什么请求必须在servlet中重写该请求方法。
	JSON:(JavaScript Ojbect Notation)是一种轻量级的数据交换格式。
		数据在键值对中,数据由逗号隔开,大括号保存对象,方括号保存数组
		Servlet中:
			1,导入json的jar包
			2,在对应的servlet类中创建Json对象    Gson gson = new Gson();
			3,转换对应的数据   String jsonstr = gson.toJson(user);
		JSP中:
			将json字符串转为js对象  var obj = $.parseJSON(jsonstr);
			获得多个对象时采用循环获得并进行格式化:
				var str = "";
					for(var i = 0;i < obj.length; i++){
						str += "账号:"+obj[i].account+",性别:"+obj[i].sex+",年龄:"+obj[i].age+"
"; } Jquery封装JSON: 通过out.print()返回响应结果: get请求: get请求 地址 请求参数 键 : 值 回调函数,请求成功后,读取响应内容结束后执行,data接收响应结果 $.get("Ajax2Servlet",{account:account},function(data){ document.getElementById("id").innerHTML = data; }); post请求: $.post("Ajax2Servlet",{account:account},function(data){ document.getElementById("id").innerHTML = data; }); ajax请求:更灵活 $.ajax({ url:"Ajax2Servlet", // 请求地址 type:"post", // 请求方式 data:{account:account},// 请求数据 success:function(data){ document.getElementById("id").innerHTML = data; } }); 通过json返回响应结果: get请求(单个对象): $.get("user",{account:account},function(data){ $("#msgId").html("账号:"+data.account+",性别:"+data.sex+",年龄:"+data.age); },"json"); get请求(多个对象):没有请求数据 $.get("ListUser",null,function(data){ // 循环并按指定格式获得多个对象 var str = ""; for(var i = 0;i < data.length; i++){ str += "账号:"+data[i].account+",性别:"+data[i].sex+",年龄:"+data[i].age+"
"; } // 赋值给指定id的标签中 $("#msgId").html(str); },"json"); ajax中的post请求: $.ajax({ url:"ListUser", type:"post", data:{account:account}, dataType:"json", success:function(data){ // 循环并按指定格式获得多个对象 var str = ""; for(var i = 0;i < data.length; i++){ str += "账号:"+data[i].account+",性别:"+data[i].sex+",年龄:"+data[i].age+"
"; } // 赋值给指定id的标签中 $("#msgId").html(str); } }) JSON对表单提交: $("#formId").serialize() 自动将表单数据序列化为userName=jim&sex=男 $.post("saveForm",$("#formId").serialize(),function(res){ if(res == 1){ alert("保存成功"); }else{ alert("保存失败"); } })

原文链接:
https://blog.csdn.net/qq_44129924/article/details/114585069

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...