基础部分线程三个基本状态:就绪、执行、阻塞
线程五个基本操作:创建、就绪、运行、阻塞、终止
进程四种形式:主从式、会话式、消息或邮箱机制、共享存储区方式
进程是具有一定功能的程序关于某次数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。一个进程包含多个线程。
线程是进程的一个实体,是CPU调度和分配的基本单元。
四大域对象:PageContext、request、session、servletContext
九大内置对象:request、response、application、config、Exception、page、out、pageContext、session
- 使用final关键词修饰一个变量的时候是引用不能变还是引用的对象不能变?
Final关键词修饰一个变量是指引用变量不能变。引用变量所指对象的内容是可以变化的。
- Private、protected、public的区别
private:
继承成员但没有访问权限。(可以通过此类中的protected成员函数和public成员函数访问。)
protected:
继承成员,有访问权限,类外没有访问权限,不可将继承的protected修改为private.
public:
继承成员,有访问权限,类外有访问权限。
- 父类和子类都有静态代码块时,创建子类是先执行哪类?
静态代码块在JVM加载类的时候先执行,父类先于子类执行。
- Junit中before和beforeclass的区别
Before 在每个测试方法之前都会运行一次,只需要声明public
BeforeClass 在类中只运行一次,必须声明成public static
单例模式 public class Singleton { private static Singleton sl; private Singleton (){} public static synchronized Singleton getInstance() { if (sl== null) { sl= new Singleton(); } return sl; } }
Redis数据结构
String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合
- HashMap、HashSet和HashTable的区别
HashMap基于Map接口实现,线程非同步所以不安全。键是唯一不可重复的,但是value值可以重复且允许空值存在。
HashTable是基于Dictionary类实现,线程默认同步所以是安全的,键值唯一且不为空,value值不能为空值。
HashSet是基于set实现的,以对象作为元素,且拒绝重复对象。内部使用HashMap实现,其实就是HashMap的一个视图。
ArrayList是基于动态数组的数据结构,查询较快
LinkedList是基于链表的数据结构,因为不需要移动数据,所以增删较快。
Wait方法属于Object类,使线程放弃进入执行,进入线程等待池,只能使用notify或notifyAll方法才能唤醒此线程,线程会等待进入线程池。即使在执行此方法时,线程已进入线程池,依然会放弃执行,让出线程池,交出锁。即使线程被激活,也需要等待前方线程执行完毕后才可进入线程池执行。
Sleep方法属于Thread类,使线程在指定时间内暂停执行,让cup暂时执行其他线程,但这个线程的监控状态依然保持,当执行时间到了以后,该线程恢复到之前状态,继续执行,线程不会释放锁。
==是一个运算符,是逻辑上的判断,比较的是引用地址。
Equals是String的一个方法,是比较引用地址,在Object类时,Equals和==是一样的,对于其他类来说如果重新了Equals方法,则比较的两个对象的数据内容。
HashCode和Equals都是在Object类中定义的,是对两个对象地址的比较,如果重写了Equals方法就必须重写HashCode方法。
HashCode方法返回的是对象的散列码,返回值是int类型的散列码;Equals返回的是true和false。
如果两个对象相同,他们的HashCode值必须相同;如果两个对象的HashCode值相同,他们不一样相同。
方法重载:在同一个类中,方法名称相同,参数类型和个数不同,返回值也可以不同。
方法重写:父子类、接口和实现类之间的关系,子类可以重写父类方法,但是参数个数、类型、返回值必须相同。
- Junit中before和beforeclass的区别
Before是初始化方法,在每个程序运行之前都会执行一次。
Beforeclass在类中只运行一次。
Situation: 事情是在什么情况下发生
Task: 你是如何明确你的任务的
Action: 针对这样的情况分析,你采用了什么行动方式
Result: 结果怎样,在这样的情况下你学习到了什么
cookie数据存储在客户的浏览器上,cookie是不安全的,别人可以分析存放在本地cookie并进行cookie欺骗;
Session存储在服务器上,Session是安全的;当访问增多时,Session会占用服务器性能,可以考虑使用cookie
- 建议将登陆信息等重要信息保存在Session中,其他需要保留的信息可以存在cookie中。
ID选择器、类选择器、层次选择器、组合选择器、属性选择器、表单选择器等等
特性:原子性、一致性、隔离性、持久性。 隔离级别: ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。 ③ Read committed (读已提交):可避免脏读的发生。 ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。可分批处理 先行保存部分内容至数据库,再清空list集合,重新导入内容
在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。
GC.run
消除线性队列的“假溢出”,充分利用存储空间。
WebService是一个平台独立的、低耦合的,自包含的、基于可编程的web应用程序,可使用开放的xml标准来描述、发现、发布、协调和配置这些应用程序,是用户开发互操作的分布式系统。最基本的目的就是提供在各个不同平台的不同应用系统的系统工作能力。
1:Tomcat的Session复制。在一台Tomcat的Session发生变化时,将变更的数据分发给其它的Tomcat服务器。
2: 采用 memcached session manager 共享session。
使用redis做缓存的原因: redis是用C语言编写的,稳定性和性能更好。支持集群模式和持久化等特性,不会应为缓存量太多而导致虚拟机崩溃。Redis是独立部署的,即使网站更新,redis缓存的数据也不会消失。 集群搭建(redis需要3台主机,3台从机,则配置6台,需要6个端口): 1:安装ruby环境,上传接口工程,安装接口程序,拷贝脚本到指定位置 2:创建6个redis实例,修改配置文件 ,然后启动所有redis实例(为简化启动步骤,可编写启动脚本)。 3:执行创建集群的命令,连接测试
redis的事务 Redis的事务是一组命令的集合,Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。
redis丢失问题常见原因: . 程序bug或人为误操作· 因客户端缓冲区内存使用过大,导致大量键被LRU淘汰· 主库故障后自动重启,可能导致数据丢失· 网络分区的问题,可能导致短时间的写入数据丢失· 主从复制数据不一致,发生故障切换后,出现数据丢失· 大量过期键,同时被淘汰清理作用:acitveMQ就是消息队列,activemq安装之后,会有一个broker(经纪人)。
消息的生产者将消息发送到broker中,它不关心谁消费该消息。
消息的消费者去broker中获取信息,它不关心谁提供消息
AJAX的怎样实现同步或者怎样实现异步? $.ajax({ async:false // 为false 时 为同步, 默认 为true , 为异步 })
fastDFS分布式文件系统
fastDFS有两个角色:跟踪器(tracker)和存储节点(storage);
跟踪器负责记录图片地址,和响应java接口访问。java接口要想储存图片地址需向跟踪器发送请求,然后由跟踪器查找图片仓库地址发给java接口,同时记录储存过程,
Java接口配IP是配2个的,因为有2个跟踪器,而java接口连接IP时并不是智能的,如果连接第一个跟踪器没反应(第一个没反应不是忙就是挂了),它就会连接第二个跟踪器,不管连哪个跟踪器,最终都会返回一个地址给java接口。而两个跟踪器之间是有通信的,它们会把信息同步的,这个信息也就是meta信息,也就是管理的帐本。
跟踪器和存储节点有通信间隔时间,这个时间由我们决定。而存储节点之间也是有通信的,如果有一天存储节点和存储节点的仓库都满了,就扩张仓库,创建下一组存储节点和存储仓库。
取数据: 取数据的时候可以用java接口取,也可以用页面里的<img src=”http//…..jpg/>”取,但是src属性会在页面加载后发出2次请求。Src会根据地址去找跟踪器,而跟踪器会告诉它这地址图片在哪个存储节点身上,跟踪器这台机器上搭建是nginx服务器(反向代理服务器)这个服务器是用来解决高并发用的。Nginx服务器会根据你的路径找到存储节点身上的图片。然后再将存储节点的图片拿回来,再加载给src,到img标签里。
启动: 先设置IP再修改IP,然后三个命令分别启动跟踪器,存储节点,Nginx服务器
框架部分SpringMVC接收参数的方式 1:通过@PathVariable获取路径中传递的参数 在方法参数前 2:通过@ModelAttribute获取post请求中的form表单数据 在方法参数前 3:通过HttpServletRequest获取 4:用@RequestParam
SpringMVC配置文件 Web.xml:初始化spring容器 加载配置文件 contextConfigLocation 配置前端控制器 加载SpringMVC.Xml 设定startup为1,启动时加载 过滤所有请求 统一编码方式 CharacterEncodingFilter 过滤所有请求 Spring.xml:配置包扫描器 context:component-scan 配置注解驱动 mvc:annotation-driven 配置视图解析器 InternalResourceViewResolver <bean> 加载静态资源 mvc:resources 配置多部件解析器 CommonsMultipartResolver 设定默认编码和文件上传的最大值 加载Java的其余配置文件 context:property-placeholder
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
ssm和ssh的区别或者优势 SSH通常指Struts2做控制器,Spring管理各种组件,Hibernate负责持久化层。 SSM通常指SpringMVC做控制器,Spring管理各层组件,Mybatis负责持久化层。
相同点: 1:Spring依赖注入来管理各层组件
2:使用面向切面的AOP编程思想管理事务、日志、权限等。
不同点: Struts2和SpringMVC控制器控制视图和交互机制不同。
Struts2和SpringMVC的区别 1:SpringMVC开发效率高于Struts2,且SpringMVC以基本实现0配置。 2:SpringMVC实现依赖Servlet,是单例的,参数基于方法进行封装。 3:SpringMVC是方法级别的拦截,一个方法对应一个request上下文,方法对应URL。方法之间的变量是不共享的,方法是独立的,可以使用注解方式接收参数。 4:Struts2是类级别的拦截,一个类对应一个request的上下文,配置文件较复杂,架构比较费时费力。虽然每个方法之间也是独立的,但所有类变量都是共享的,虽然不影响运行,但是编码、读程序却比较麻烦。 5:Struts2实现依赖过滤器,是多例的,参数是基于属性进行封装。 6:Struts2需要封装每一个Request,把每个生命周期变量封装成一个个的MAP集合,并要保证线程的安全,比较耗费内存。
Hibernate和MYbatis的区别
相同点: Hibernate和Mybatis都是通过SessionFactoryBuider由xml文件生成SessionFactory,然后生成Session,由Session开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。都支持JDBC和JTA事务处理。
不同点: Mybatis:Mybatis可以进行更为细致的SQL优化,可以减少查询字段。
Mybatis相对于Hibernate更容易掌握,门栏较低。
Hibernate:Hibernate的DAO层开发比Mybatis更简单,因为Mybatis需要维 护SQL和映射结果。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
Hibernate的一级缓存和二级缓存 Hibernate的一级缓存指的是Session缓存,因为Session缓存是内置的,是Hibernate的默认配置;二级缓存指的是SessionFactory的外置缓存,因为外置缓存是数据库数据的拷贝,介质可以是内存或硬盘,需要手动开启。
spring的事务管理 Spring的事务管理分为声明式和编程式。声明式事务可以使用tx标签方式、使用代理方式以及拦截器方式。编程式事务需要在配置中配置Session工厂,配置事务管理器,开启注解扫描,使用@Service
springmvc的注解都有哪些 @Controller @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute
hibernate的优化 1:数据库设计时要降低关联的复杂性,尽量不使用联合主键,适用冗余数据,不过分追求高范式 2:使用延迟加载
hibernate的五个核心类
Configuration,sessionfactory,Session,query接口,transaction接口
Spring的优点: 缺点
优点: 方便解耦,简化开发---Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理AOP编程的支持---Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能声明式事务的支持---只需要通过配置就可以完成对事务的管理,而无需手动编程方便程序的测试---Spring对Junit4支持,可以通过注解方便的测试Spring程序方便集成各种优秀框架---Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持降低JavaEE API的使用难度---Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
缺点: jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器spring工作机制和为什么要用 工作机制:Spring的核心就是IOC和AOP所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。
原因:借助于Spring AOP,Spring IOC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置
Springmvc是spring一部分
IOC:控制反转,生产对象用。控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。
AOP:面向切面编程,底层使用动态代理,作用:管理事务和安全监控,事务 只需要配置一次就不用再配置。
Mvc是一个架构设计思想: 用户发送请求至控制器(Controller),控制层把用户请求转发给模型Model层进行数据处理,Model层内包含javabean组件、领域模型、业务层、持久层,Model层处理完数据层响应给控制层,控制层再次把数据发送给视图View进行视图编译,然后由View层把视图页面返回给控制层,控制层再响应给用户。
Freemaker放在那里,如何访问
实现过程: 在商品添加服务中发送商品ID消息,接收消息中的商品ID。 从spring上下文中获取Freemarker的配置文件(configuration)对象。 通过configuration创建模板(template对象),模板的名称在java配置文件中配置。 创建模板数据:根据商品ID查询出商品信息,如果没有数据,抛出异常。 指定输出文本。文本的路径在java配置文件中配置,文本的名称是商品ID,文本的后缀在java配置文件中配置。 调用template的process方法,生成输出文件。 可以发送异步请求,使用Nginx访问
临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。
持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
Java对象:开始生命周期——》临时状态——》持久化状态——》游离状态——》结束生命周期
1、实例化阶段 调用init()方法 2、服务阶段 调用service()方法 3、销毁阶段 调用destroy()方法 首先客户发送一个请求,Servlet是调用service()方法对请求进行响应,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doPost,doGet等这些方法。ORM 对象关系映射,也就是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
JVM - JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM执行程序的过程 : I.加载.class文件
II.管理并分配内存
III.执行垃圾收集
JDBC JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
Struts2框架工作流程及原理 1、客户端浏览器发出HTTP请求.2、根据web.xml配置,该请求被FilterDispatcher接收3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面6、返回HTTP响应到客户端浏览器
原理: 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 ActionProxy创建一个ActionInvocation的实例。 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 数据库部分数据库优化问题 1:表的设计要符合三范式。 2:添加适当存储过程,触发器,事务等。 3:添加适当的索引,索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引 4:读写分离(主从数据库,主数据库进行写的操作,从数据库惊醒读的操作,主数据库将数据更新到从数据库) 5:对sql语句的一些优化,(查询执行速度比较慢的sql语句) a:查询中避免使用通配符,尽量使用索引。选择联合查询的联合次序 b:在子查询中避免使用in 或 not in 语句,使用where (NOT) exists的效果要好的多;避免使用BY RAND随机显示结果。 c:使用联合(UNION)代替手动创建的临时表,拆分表格。 d:尽可能的使用NOT NULL(非空),对MySQL的配置进行优化 6:分表分区 分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储,对mysql服务器硬件的升级操作。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
如果数据库里边的大表添加字段 怎么弄效率最高
alter table ~ add ~ 添加列
mysql默认的最大连接数是多少? mysql的最大连接数默认是100, 最大可以达到16384
mysql分页;limit关键字 limit关键字:LIMIT 可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
创建索引库的优缺点?
优点:通过创建唯一性索引,可以保证数据库中每一行数据的唯一性,2,可以大大加快数据的检索速度,这也是创建索引的最主要的原因,3.可以加速表与表之间的连接,特别是在实现数据的参考完整性。
缺点:创建索引和维护索引需要消耗时间,这种时间随着数据的增加而增加,2.索引占用物理空间,需要的空间变大,3.当对数据库中的数据进行增删改的时候,索引也需要动态的维护,此时降低了维护速度。
- 集合去重,数据库去重;(集合去重有contains方法;数据库去重用group by)
集合去重: a:转化为Set集合,因为HashSet集合不允许重复值存在。 b:使用双重循环删除重复的值或者用null代替 c:用contains方法
数据库去重: a:使用嵌套的查询 得到所有的不重复数据的Id,使用 not in 关键字删除所有ID不在以上范围中的数据。 b:使用嵌套的查询 得到所有的不重复数据的Id,将所有数据存储到一个临时表中,删除原表,重新构建原表,将临时表数据导入原表,删除临时表
Alter table user add index_name(name),括号内为字段名称
Alert table user add primary key(id)
Alert table user add unique (creattime)
Alert table user add fulltext(name)
|