sql左连接右连接区别
left join 左连接:
将左表所有数据查询出来而右表只是查出on条件后满足的部分。左连接全称为左外连接,是外连接的一种。
right join 右连接:
将右表所有的数据查询出来,而左表只是查出on条件后满足的部分。右连接全称为右外连接,是外连接的一种。
inner join 内链接:
查询出两个表中满足条件的共有数据。
tomcat调优
找到Tomcat根目录下的conf目录,修改server.xml文件的内容。
- 不建议修改Tomcat的字符集,过于死板。
- maxThreads="300" : 设置Tomcat的最大并发数,Tomcat默认最大为150个,实际运用中,最大并发数与硬件性能和CPU数量有很大的关系,如果某个应用250以上并发的时候可以考虑服务器的集群。
- minSpareThreads="50" :设置Tomcat初始化时创建的线程数,默认值为25。
- acceptCount="250" :当同时连接的人数达到maxThreads参数设置的值时,仍可接收排队的连接,默认为100,超过这个数的请求后将不予处理。在应用时,如果想加大Tomcat的并发数应同时加大acceptCount和maxThreads的值。
- enableLookups="false" :是否开启域名反查,一般设置为false来提高处理能力,它的取值还有true,一般很少使用。
- maxKeepAliveRequests="1":nginx(一个高性能的HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器)动态的转给Tomcat,nginx是不能keepalive(保持活力)的,而Tomcat端默认开启了keepalive。会等待keepalive的timeout(超时)默认不设置就是使用connectionTimeout(连接超时)所以必须设置Tomcat的超时时间,并关闭Tomcat的keepalive,否则会产生大量Tomcat的sockettimewait(等待时间)。maxKeepAliveRequests=”1”就可以避免tomcat产生大量的TIME_WAIT(时间等待)连接,从而从一定程度上避免tomcat假死。
总结:要想避免tomcat产生大量TIME_WAIT(时间等待)连接,设置Tomcat的超时时间,并关闭Tomcat的keepalive。
jvm调优
1.内存调优
找到Tomcat根目录下的bin目录,设置catalina.sh文件中JAVA_OPTS变量即可。
2.垃圾回收策略调优
一般分为:串行收集器.并行收集器和并发收集器。
详细描述MVC
基于java的Web应用系统采用MVC架构模式,即model(模型)、view(视图)、control(控制)分离设计;这是目前web应用服务系统的主流设计方向。
- Model:即处理业务逻辑的模块,每一种处理一个模块;
- View:负责页面显示,显示MODEL 处理结果给用户,主要实现数据到页面转换过程;
- Control:负责每个请求的分发,把FORM 数据传递给MODEL 处理,把处理结果的数据传递给VIEW 显示。
String、StringBuffer与StringBuilder之间的区别
String:字符集常量 StringBuffer:字符创变量 StringBuilder:字符创变量
String是final类,也就是说String类不能被继承。并且String的成员方法默认都是final类,在java中final修饰的类是不允许继承的。对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
对于三者使用的总结:
- 如果要操作少量的数据用 = String
- 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
java中wait和sleep有什么区别?多线程条件下如何保证数据安全?
最大区别是等待时wait(等待)会释放锁,而sleep(关闭)会一直持有锁,wait通常用于线程时交,互,sleep通常被用于暂停执行。
有了解java 的原子类?实现原理是什么?
采用硬件提供原子操作指令实现的,即CAS。每次调用都会先判断预期的值是否符合,才进行写操作,保证数据安全。
Spring主要使用了哪些?IOC实现原理是什么?AOP实现原理是什么?
String主要功能有IOC,AOP,MVC等。
IOC实现原理:先反射生成实例,然后调用时主动注入。
AOP实现原理:主要使用java动态代理。
缓存框架有使用过哪些?memcache和redis有什么区别?项目中如何选择?
缓存有:ehcache、memcache(内存缓存) 和redis等。
区别:
- Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过Memcache还可用于缓存其他东西。例如:图片视频等等。
- Redis不仅仅支持简单的K/V类型(key- vlalue 键值对,NoSQL非关系型数据库)的数据,同时还提供list,set,hash等数据结构的存储。
- 虚拟内存—Redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘。
- 过期策略—Memcache在set时就指定,例如set key1008,即永不过期。Redis可以通过例如expire(到期)设定,例如expire name 10
- 分布式—设定Memcache 集群,利用magent做一主多从;Redis可以做一主多从。都可以一主多从。
- 存储数据安全—Memcache挂掉后,数据没了而且数据不可恢复;Redis可以定期保存到磁盘(持久化),Redis丢失后可以通过aof恢复。(AOF持久化(即Append Only File持久化)。
- Redis支持数据的备份,即master-slave模式的数据备份。
项目使用选择:
Redis是单线程实现,若需要使用控制某些并发状态时,项目中需要使用复杂的list,set操作时可以使用Redis,同时可以对数据进行持久化。
当存储数据较大,多核上时,如100k以上,那memcache性能比较好。
说说数据库性能优化有哪些方面?
使用explain进行优化,查看sql是否充分使用索引。避免使用in用exist替代,字段值尽可能使用更小的值,任何对队列的操作都会导致表扫描,它包括数据库函数,计算表达式等等,查询时要尽可能将操作移至等号右边。使用连接查询(inner)代替子查询。在表的多列字段上建立一个索引,但只有在查询这些字段的第一个字段时,索引才会被使用。
HTTP请求方法get和post有什么区别
- Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示出来
- Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节。
- Post就是为了将数据传送到服务器,Get就是为了从服务器取得数据,而Get之所以也能传送数据,只是用来设计告诉服务器你到底需要什么样的数据。Post的信息作为http请求的内容,而Get是在Http头部传输。
linux命令熟悉?查看某个线程命令是什么?查看整个机器负载命令?文件内容快速查找命令是什么?
- 查看线程:ps -ef|greptomcat
- 查看负载:top
- 文件内容查找:vi/aa test.txt 或者先打开文件,在查找:vi test.txt/aa
Jvm内存模型是如何?垃圾回收机制有哪些?如何对jvm调优
由堆和栈组成,栈是运行单位,堆内存则分为年轻代、年老代、持久代等,年轻代中的对象经过几次回收,仍存在则被移到年老代;持久代主要是保存class,method,filed等对象。
Sun回收机制:主要针对年轻代和年老代中的存活对象进行回收,分以下:
年轻代串行(Serial Copying)、年轻代并行(ParNew)、年老代串行(SerialMSC),年老代并行(Parallel Mark Sweep),年老代并发(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最广泛。
JVM调优主要是对堆内容和回收算法进行配置,需要对jdk产生的回收日志进行观察,同时通过工具(Jconsole,jProfile,VisualVM)对堆内存不断分析,这些优化是一个过程,需要不断地进行观察和维护。
有了解分布式事务如何实现?
分布式事务可以采用分布式锁进行实现,目前zookeeper就是提供此锁;分布式锁需要牺牲一定性能去实现,若业务支付最终一致性,那么此方法是最佳方案。如在京东下订单,过一会才会告诉你订单审核通过,而不是马上相应订单结果。
这些是自己在面试中碰到的面试题还没有整理完成先发布一些后期还会在增加