java mysql为什么会执行失败@?



13.1.6 在浏览器地址栏输入一个HTTPURL地址,按下回车键之后,浏览器怎么通过HTTP显示位于远端服务器中的某个简单HTML资源?

1)浏览器从URL中解析出服务器的主机名;

2)浏览器将服务器的主机名转换成服务器的IP地址;

3)浏览器将端口号(如果有的话),从URL中解析出来;

4)浏览器建立一条与Web服务器的TCP连接;

5)浏览器向服务器发送一条HTTP请求报文;

6)服务器向浏览器回送一条HTTP响应报文;

7)关闭连接,浏览器显示文档。

HTTP是应用层协议。它把联网的细节都交给了通用、可靠的因特网传输协议TCP\IP协议。

HTTP 应用层、 TCP 传输层、 IP 网络层、 网络特有的链路接口 数据链路层、 物理网络硬件 物理层

4. OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层

5. HTTP 无法加密,而HTTPS 对传输的数据进行加密

一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;

二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);

三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;

四、发送给服务端,此时只有服务端(RSA私钥)能解密。

五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。

在说HTTPS之前先说说什么是HTTPHTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSLSecure Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPSSSL目前的版本是3.0,被IETFInternet 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用。

14.1.1 网络编程时的同步、异步、阻塞、非阻塞?

同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果。

异步:函数调用在没得到结果之前,没有调用结果,返回状态信息。

阻塞:函数调用在没得到结果之前,当前线程挂起。得到结果后才返回。

非阻塞:函数调用在没得到结果之前,当前线程不会挂起,立即返回结果。

141.2 什么情况下需要序列化?序列化的注意事项,如何实现java

当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

· 当你想用套接字在网络上传送对象的时候;

· 当你想通过RMI传输对象的时候;

1、如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常。

2、静态变量不会被序列化,那是类的“菜”,不是对象的。串行化保存的是对象的状态,即非静态的属性,即实例变量。不能保存类变量。

3transient关键字修饰变量可以限制序列化。对于不需要或不应该保存的属性,应加上transient修饰符。要串行化的对象的类必须是公开的(public)。

4、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID是否一致,就是 private static final long serialVersionUID = 1L

5Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用。反序列化时,恢复引用关系。

6、序列化到同一个文件时,如第二次修改了相同对象属性值再次保存时候,虚拟机根据引用关系知道已经有一个相同对象已经写入文件,因此只保存第二次写的引用,所以读取时,都是第一次保存的对象。

141.3 java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

JDK提供的流继承了四大类:

输入流: 程序可以从中读取数据的流。

输出流: 程序能向其中写入数据的流。

字节流:以字节(8位二进制)为单位进行处理。主要用于读写诸如图像或声音的二进制数据。

字符流:以字符(16位二进制)为单位进行处理。

都是通过字节流的方式实现的。字符流是对字节流进行了封装,方便操作。在最底层,所有的输入输出都是字节形式的。

节点流:从特定的地方读写的流类,如磁盘或者一块内存区域。

过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或者输出流连接创建的。

Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK置为1ack=K+1,并将该数据包发送给ServerServer检查ack是否为K+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了。

connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

三次握手耳熟能详,四次挥手估计就少有人知道了。所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

1 TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。

服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。

4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1

3)标志位:共6个,即URGACKPSHRSTSYNFIN等,具体含义如下:

A)不要将确认序号Ack与标志位中的ACK搞混了。

B)确认方Ack=发起方Req+1,两端配对。


注意啦,序列化为Json串后,Josn串是没有Long类型呢。而且反序列化回来如果也是Object接收,数字小于Interger最大值的话,给转成Integer啦!
newFixedThreadPool线程池的核心线程数是固定的,它使用了近乎于无界的LinkedBlockingQueue阻塞队列。当核心线程用完后,任务会入队到阻塞队列,如果任务执行的时间比较长,没有释放,会导致越来越多的任务堆积到阻塞队列,最后导致机器的内存使用不停的飙升,造成JVM OOM。

14. 直接大文件或者一次性从数据库读取太多数据到内存,可能导致OOM问题

如果一次性把大文件或者数据库太多数据达到内存,是会导致OOM的。所以,为什么查询DB数据库,一般都建议分批。

读取文件的话,一般文件不会太大,才使用Files.readAllLines()。为什么呢?因为它是直接把文件都读到内存的,预估下不会OOM才使用这个吧,可以看下它的源码:

如果是太大的文件,可以使用Files.line()按需读取,当时读取文件这些,一般是使用完需要关闭资源流的哈

15. 先查询,再更新/删除的并发一致性问题

在日常开发中,这种代码实现经常可见:先查询是否有剩余可用的票,再去更新票余量。

如果是并发执行,很可能有问题的,应该利用数据库更新/删除的原子性,正解如下:

日常业务开发中,我们经常跟事务打交道,事务失效主要有以下几个场景:

  • 底层数据库引擎不支持事务
  • 在非public修饰的方法使用
  • 异常被try...catch吃了,导致事务失效。

其中,最容易踩的坑就是后面两个,注解的事务方法给本类方法直接调用,伪代码如下:

如果用异常catch住,那事务也是会失效呢~,伪代码如下:

如果不通过反射,传入Integer.valueOf(100),走的是Integer重载。但是呢,反射不是根据入参类型确定方法重载的,而是以反射获取方法时传入的方法名称和参数类型来确定的,正解如下:

有更新语句的时候,timestamp可能会自动更新为当前时间,看个demo

我们可以发现c列是有CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,所以c列会随着记录更新而更新为当前时间。但是b列也会随着有记录更新为而更新为当前时间

之前我们对mysql数据库进行升级,新版本为8.0.12。但是升级完之后,发现now()函数,获取到的时间比北京时间晚8小时,原来是因为mysql8默认为美国那边的时间,需要指定时区

全局变量的SimpleDateFormat,在并发情况下,存在安全性问题。

又因为Calendar内部并没有线程安全机制,所以全局共享的SimpleDateFormat不是线性安全的。

我要回帖

更多关于 mysql查看sql执行进度 的文章

 

随机推荐