网络
http header ,Cookie和Session的区别?分别是用于什么场景?优缺点?
session 在服务器端,cookie 在客户端(浏览器)
session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
http1.0、1.1和http2.0区别
HTTP1.0和HTTP1.1的一些区别
1.缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
2.带宽优化及网络连接的使用,HTTP1.0中,不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
3.Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
4.长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
HTTP2.0和HTTP1.X相比的新特性
1.新的二进制格式(Binary Format)HTTP1.x的解析是基于文本存在缺陷,HTTP2.0的协议解析决定采用二进制格式。
2.header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
3.多路复用(MultiPlexing),让所有数据流共用同一个连接,可以更有效地使用 TCP 连接。
4.服务端推送(server push),提前缓存可能需要的文件。
http协议 POST和GET的区别
GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
PUT:PUT的英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。
get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而post无限制。GET的所有参数全部包装在URL中,明文显示,且服务器的访问日志会记录,非常不安全,GET方法是幂等、可缓存的(除非有 Cache-ControlHeader的约束),POST的URL中只有资源路径,不包含参数,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全。所有涉及用户隐私的数据都要用POST传输,POST不幂等,(大部分实现)不可缓存。
TCP三次握手、四次挥手
建立连接协议(三次握手):
1.第一次握手:客户端发送syn包(syn=x)的数据包到服务器,并进入SYN_SEND状态,等待服务器确认;
2.第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3.第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。
连接终止协议(四次握手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
1.第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
2.第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号, SYN 和 FIN 都有seq序号)。
3.第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
4.第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
http keep alive http://a280606790.iteye.com/blog/1095085
1、什么是Keep-Alive模式?
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。
2、启用Keep-Alive的优点
从上面的分析来看,启用Keep-Alive模式肯定更高效,性能更高。因为避免了建立/释放连接的开销。
3、回到我们的问题(即如何判断消息内容/长度的大小?)
Keep-Alive模式,客户端如何判断请求所得到的响应数据已经接收完成(或者说如何知道服务器已经发生完了数据)?我们已经知道 了,Keep-Alive模式发送玩数据HTTP服务器不会自动断开连接,所有不能再使用返回EOF(-1)来判断(当然你一定要这样使用也没有办法,可 以想象那效率是何等的低)!下面我介绍两种来判断方法。
3.1、使用消息首部字段Conent-Length
故名思意,Conent-Length表示实体内容长度,客户端(服务器)可以根据这个值来判断数据是否接收完成。但是如果消息中没有Conent-Length,那该如何来判断呢?又在什么情况下会没有Conent-Length呢?请继续往下看……
3.2、使用消息首部字段Transfer-Encoding
当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-length消息首部字段告诉客户端 需要接收多少数据。但是如果是动态页面等时,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输 数据了。即如果要一边产生数据,一边发给客户端,服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。
Linux
https://blog.csdn.net/xiaomingdetianxia/article/details/77894371
一行shell杀死进程
kill -s 9 `ps -ef | grep i2c_no_log_fan | grep -v "grep" | awk '{print $2}'`
查看某一进程下面所有线程的性能指标(top -p 4361 -H)ps -eLf 查看所有所有进程的所有线程
一个文件中,id列/行 统计数值出现的次数并排序 http://blog.csdn.net/xunmengpiaoyun/article/details/27174501
cat datafile | awk '{print $1}' | sort | uniq -c | sort -k 1 -n -r | wc -l > result.txt
使用sed,awk,acc等技术取出test.txt第二行第二列的字段,并追加到text.text的最后(不能用>>)
Java
https://blog.csdn.net/as6757uyy65uy75/article/details/79370686
什么是多态
方法要有继承,要有重写;对象要有父类引用指向子类对象
java类的成员初始化顺序和初始化块知识
属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序:
1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。
修饰符有四种:public、protected、默认、private。
public:表示所有其他类都可以访问。
protected:当前类或子类可以访问,同时相同包内的其他类也可以访问protected成员;
default :默认(没有修饰符):表示本包内可以使用
private:表示的是在本类内可以使用;其子类不能访问,更不能允许跨包访问。
Volatile的作用?Synchronized修饰静态变量和普通变量的区别?java线程池的实现原理?
静态变量,非静态变量
用static修饰的变量叫静态变量。静态变量不需要new出对象引用来调用,它可以直接用类名直接调用。当然用对象引用也能调它,只是不需要。
非静态变量则必须用对象引用进行调用。
静态变量在内存空间中只有一份,也永远只有一份。大家共享。
非静态变量只要new出一个对象引用就会在内存中分配一份空间给它。
并且他两的存放地点不一样,静态变量存放在栈空间。非静态变量存放在堆空间里。
Java try里面有return语句,finally是否会执行,是在return前还是return后执行:finally语句是在try的return语句执行之后,return返回之前执行。
多线程的适用场景?实现方法?
线程或者说多线程,是我们处理多任务的强大工具。线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享;而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同的线程之间可以在进程范围内共享数据。也就是说进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。线程的使用可以使我们能够并行地处理一些事情。线程通过并行的处理给用户带来更好的使用体验,比如你使用的邮件系统(outlook、Thunderbird、foxmail等),你当然不希望它们在收取新邮件的时候,导致你连已经收下来的邮件都无法阅读,而只能等待收取邮件操作执行完毕。这正是线程的意义所在。
实现线程的方式有四种:
https://www.cnblogs.com/itzyz/p/11077091.html
继承java.lang.Thread类,并重写它的run()方法,将线程的执行主体放入其中。
实现java.lang.Runnable接口,实现它的run()方法,并将线程的执行主体放入其中。
实现Callable接口通过FutureTask包装器来创建Thread线程
使用ExecutorService、Callable、Future实现有返回结果的线程
实际题目:有4000个任务,需要快速处理,怎么用多线程的知识进行处理?
方案一:Redis集群,将任务数据相关内容提前发布到redis,到了一定时间把流量打开,这时候缓存已经准备好了。使用servlet,springMVC,多开出一些节点来满足高并发的开销
方案二:分布式系统,MAS,reactive,eventsourcing,CQRS。并发意味着数据竞争+线程之间的时间上无序。VertX或者Akka
java 线程状态类型:
1. 新建状态(New):新创建了一个线程对象。
2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
死锁的四个必要条件?
程序中必须同时满足以下四个条件才会引发死锁:
互斥(Mutual exclusion):
线程所使用的资源中至少有一个是不能共享的,它在同一时刻只能由一个线程使用。
持有与等待(Hold and wait):
至少有一个线程已经持有了资源,并且正在等待获取其他的线程所持有的资源。
非抢占式(No pre-emption):
如果一个线程已经持有了某个资源,那么在这个线程释放这个资源之前,别的线程不能把它抢夺过去使用。
循环等待(Circular wait):
假设有N个线程在运行,第一个线程持有了一个资源,并且正在等待获取第二个线程持有的资源,而第二个线程正在等待获取第三个线程持有的资源,依此类推……第N个线程正在等待获取第一个线程持有的资源,由此形成一个循环等待。
wait和sleep的区别。哪一个会释放对象锁?
1、对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
2、在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
Java集合框架的基础接口有哪些?
Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
set集合的三种遍历方式:1.利用迭代器进行 ,迭代遍历:
Set<Object> sets = new HashSet<Object>();
Iterator<Object> it = set.iterator();
while (it.hasNext()) {
String str = (String)it.next();
System.out.println(str);
}
2.for循环遍历:
for (String str : sets) {
System.out.println(str);
}
3.Set<Object> set = new HashSet<Object>();
foreach循环遍历:
for (Object obj: sets) {
if(obj instanceof Integer){
int aa= (Integer)obj;
}else if(obj instanceof String){
String aa = (String)obj
}
……..
}
List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。
Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。
方法一:在for循环中使用entries实现Map的遍历:
/*** 最常见也是大多数情况下用的最多的,一般在键值对都需要使用
*/Map map =newHashMap();
map.put("熊大", "棕色");
map.put("熊二", "黄色");for(Map.Entry entry : map.entrySet()){
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey+":"+mapValue);
}
方法二:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好;
Map map =newHashMap();
map.put("熊大", "棕色");
map.put("熊二", "黄色");//keyfor(String key : map.keySet()){
System.out.println(key);
}//valuefor(String value : map.values()){
System.out.println(value);
}
方法三:通过Iterator遍历;
Iterator> entries = map.entrySet().iterator();while(entries.hasNext()){
Entry entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
}
方法四:通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作;
for(String key : map.keySet()){
String value = map.get(key);
System.out.println(key+":"+value);
}
Map的一般用法:
1.声明一个Map,Map map = new HashMap();
2 .向map中放值 ,注意: map是key-value的形式存放的,如:map.put("sa","dd");
3 .从map中取值,String str = map.get("sa").toString,结果是: str = "dd';
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
hashtable和hashmap区别,concurrenthashmap是如何保证线程安全的
HashMap的实现原理
HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值
hashmap的用法
==和equal的区别
==比较的是对象的地址,也就是是否是同一个对象;equal比较的是对象的值。
多线程死锁的原因及解决办法
http://www.jianshu.com/p/1b2f63a45476
JVM内存分配和优化方案。一个tomcat应用总是触发full GC,可能情况及如何改正
什么时候会触发GC?
>>当Eden区和From Survivor区满时;
>>调用System.gc时,系统建议执行Full GC,但是不必然执行
>>年老代空间不足
>>方法区空间不足
>>通过Minor GC后进入老年代的平均大小大于老年代的可用内存 >>由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
Java线程终止方法
在 Java 中有以下 3 种方法可以终止正在运行的线程:
1.使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。
2.控制循环条件和判断条件的标识符来结束掉线程
3.使用 interrupt 方法中断线程。
String、StringBuffer、StringBuilder
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
String中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
Spring框架特点
Spring最根本的使命:简化Java开发。
控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。负责实例化,定位,配置应用程序中的对象以及建立这些对象间的依赖。get、set方式注入。
面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。
Spring的DispatcherServlet作用
Spring Validator作用:校验器,Spring框架的 validator 组件,是个辅助组件,在进行数据的完整性和有效性非常有用
Spring接口的标签注解有哪些?
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
controller的注解有哪些?
@RequestMapping注解是web应用程序中最常被用到的注解之一,作用就是映射URL路径,将http的请求地址映射到控制器(controller)类的处理方法上。
@RequestMapping注解可以定义在控制器类上,也可以定义在类里面的方法上。
@Autowired spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get
Spring是如何调用到DAO层的
JVM 类加载顺序(内存划分、垃圾回收机制)
static 关键字
设计模式用过哪些或者知道哪些
java assert断言
Java在默认条件下是不启用的,要启用就需要在编译、运行时加上相关的关键字
1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false
2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
3.使用断言测试方法执行的前置条件和后置条件
4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)
如何解析json
运维
nginx 的原理
memchached/redis的区别
移动端
移动app 碎片化即兼容性测试,cpu、内存、耗电、流量等如何测试
Android Fragment和Activity的区别?
Android 进程优先级 举例子
service 和activity交互的方法
自定义view 有哪些方法重写,分别干嘛
内存溢出 内存泄露举例
listview的优化(contentview,加载过程优化)与模式改变(上拉,下滑 右滑)
android四种加载模式
操作系统
堆和栈里分别存了什么?
MOCK是如何做的
其他
如何在Java中发送HTTP GET/POST请求:
1.Java原生HttpURLConnection
2.Apache的HttpClient库
ioc如何解耦:
简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
解耦后能保障业务不相互干扰吗?
空指针出现的条件?
1.调用空对象的实例方法。
2.访问或修改空对象的字段。
3.将null的长度看作是一个数组。
4.访问或修改null的插槽,就像它是一个数组一样。
5.如同Throwable值一样抛出null。
内存溢出出现的条件?
接口自动化框架的整体思路
hashmap如何遍历,如何传值?
通过Map.keySet遍历key和value
通过Map.entrySet使用iterator遍历key和value
通过Map.entrySet遍历key和value
通过Map.values()遍历所有的value,但不能遍历key
压测如何准备数据,目标是什么?
java里面的锁 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8.自旋锁
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
介绍一下springmvc
核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
数据库
数据库的四大特性
1. 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事物有任何影响。
2. 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3. 隔离性(Isolation)
隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰,多个并发事务之间,应当相互隔离。
4. 持久性(Durability)
持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
数据表中添加一个字段的标准SQL语句写法为:
alter table 表名 add (字段 字段类型) [ default '输入默认值'] [null/not null] ;
举例:ALTER TABLE employee ADD spbh varchar(20) NOT NULL Default 0
意思就是在表employee 中加入 字段spbh,该字段的类型是varchar,大小20,并且不允许为空,初始默认值是0。
登录中,密码如何加密传输
前端代码加密,后端代码解密。RSA算法
MySQL中存储引擎及区别
InnoDB和MyISAM
写一个sql语句,查询两个关联表中的信息,结果有多行,只输出一行
mysql的一些概念,如事物、实例、会话:事务(transaction):简单理解就是一个业务需求的最小处理单位。会话(session):可以包含N个事务。MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的,一个实例(instance)可以操作多个数据库,故一个会话(session,在操作系统概念里,会话即是线程)可以操作一个实例上的多个数据库。
数据库的四种连表方式
1)内连接:相当于select a.*,b.* from a,b where a.id = b.id
select a.*,b.* from a inner join b on a.id=b.parent_id
2)左连接:左表的挨个信息去查询,查不到则将右边控制为null进行显示
select a.*,b.* from a left join b on a.id=b.parent_id
3) 右连接:右表的挨个信息去查询,查不到则将左边控制为null进行显示
select a.*,b.* from a right join b on a.id=b.parent_id
4)全连接:
select a.*,b.* from a full join b on a.id=b.parent_id
数据字典意义:数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容
宽表意义,怎么和代码结合
MySql的慢SQL:可以设置slow/long-time-query查看,原因可能是没有索引,两个表join时候产生笛卡尔积,锁或死锁,单次查询数据量过大。
索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
数据库索引的类型 MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快
数据库的锁 简单的数据库锁的大致类型有三种: 共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。 排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。 更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。
为什么要使用MQ?
MQ是一个互联网架构中常见的解耦利器。
什么时候不使用MQ?上游实时关注执行结果
什么时候使用MQ?
1)数据驱动的任务依赖
2)上游不关心多下游执行结果
3)异步返回执行时间长
JDBC与Mybatis区别
1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.
3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。
https://blog.csdn.net/weixin_47555380/article/details/107822353
java 跨平台特性怎么实现的?
主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上都能运行。
java 为什么那么定义多报错类型
把不同业务场景产生的异常, 定义成不同的类型,方便定位错误