本次面试题是本人面试后的总结,我把所有能想到的都写了,如果有什么不对的,请各位指正
1、 oracle和mysql分页都是怎么分页的?
2、 Oracle 的rowID和rowNum有什么区别;
3、 Oracle或者mysql数据量比较大的时候分页怎么分才会比较快,即如何用rowID关键字来快速分页;
4、 Mysql数据量非常大(几百万几千万)的时候怎么分页查询;
5、 Oracle和mysql 分页时使用order by 方在哪个位置;
6、 索引(Index):单列索引和联合索引的区别;联合索引时多个字段(A、B、C)三个字字段,如果只有BC,会不会走这个索引,数据库解析SQL的顺序、SQL解析器,转成执行计划
7、 数据库SQL的解析顺序,SQL解析器,执行计划;
8、 数据库连接池相关问题;
9、 线程池;
10、 分布式框架:dubbo;
11、 多看看源码;
12、 java同步synchronized问题;
13、 集合类:collection 和set list的子集;arrayList和linkedList 的区别;如何把这两个List变成线程安全的list
14、 Linux常用指令:top、kill-9 :为啥要加-9?
15、 Linux对某个用户的线程数量的约束;
16、 Oracle聚合查询函数;
17、 单例模式用在什么地方;
18、 责任链模式是怎么实现的,策略模式和责任链模式的区别;
19、 有没有写过过滤器;
20、 SpringMVC常用的注解;ulimit、service、controler、responseBody、Transaction
21、 定时任务失败之后重新跑怎么跑;发短信和发邮件的时候因为网络原因发失败,有100个人,只发了30个人,系统重启之后如何实现重新发送剩下70个人的方法;
22、 SpringMVC 事务加在哪个层(dao层、service层、controller层);
23、 (Transaction)事务的注解;
24、 Redis缓存;
25、 MQ缓存系统;
面试者建议:设计模式写的少,没有毛病,但是需要注意Java基础知识;
1、 对于Mysql数据库,我们可以采用limit语句进行分页,对于oracle数据库,我们可以采用rownum的方式进行分页;
l Mysql的limit m,n语句;
Limit后的两个参数中,参数m是起始下表,它从0 开始;参数n是返回的记录数。我们需要分页的话置顶这两个值即可;
l Oracel数据库的rownum’;
在oracle数据库中,分页方式没有Mysql这样简单,它需要依靠rownum来实现。RowNum表示一条记录的行号,这个行号是数据加载到内存中然后取出来的。他是在获取每一行之后才给它赋予行号,因此想置顶rownum的区间来取得分页数据在一层查询语句中是无法做到的,要分页还要再进行一次查询。
Select * from
(
Selecta.* ,a.rownum rn from a
(
(Select * from user ) a where a.rownum<20
) where rn>10;
)
其中最内层的查询 select * fromuser 表示不进行翻页的原始查询语句。
Rownum<20和rn》10控制分页查询的每页的范围;上面给出的这个份额查询条件,在大多数情况下有较高的效率。分页的目的就是控制输出结果集的大小,将结果集尽快的返回。在上面的查询语句中,这种考虑主要体现在where a.rownum <20这句话中,还有一种查询方法如下:
Select * from
(
Select A.*,rownum rn from
(
Select* from user a
)where rn between 10 and 20
)
在绝大多数情况下第一种方法效率比较高,效率高的原因有涉及到SQL的解析顺序,有兴趣的同学自行百度
2、 Rowed和rownum有什么区别
Rownum和rowid都是虚列,但是含义完全不同。Rowid是物理地址,用于定位oracle中具体数据的物理存储位置,而rownum则是sql输出结果的排序。通俗的讲:rowid是不变的,rownum是会变化的,尤其是在使用order by 的时候;
Rowed:用于定位数据表中的某一条数据的位置,是唯一的,也是不变的。
Rownum:表示查询某条记录在整个结果集中的位置,同一条记录查询条件不同对应的荣威怒骂不同,而rowid是不会变的。
3、 Oracle和mysql数据量比较大的时,如何优化sql,使其在分页的时候查询速度较快;
4、 Oracle和mysql在使用分页的时候,orderby放在哪个位置?
Oracle在分页时使用orderby,放在两层嵌套的里面,即放在两个where子句:where rownum<30 和whererownum>10 的里面。
5、 单列索引和联合索引的区别,联合索引如何使用;
单列索引:只要条件(where子句中)中出现索引列,无论在什么位置,都能利用索引查询;
联合索引:1)、条件查询中出现联合索引第一列,或者全部,则能利用联合索引(与SQL解析顺序有关系);2)、条件中只要条件相连在一起,无论前后,都会利用上联合索引;3)、查询条件中没有出现联合索引的第一列,而出现了联合索引的第二列、或者第三列,则都不使用联合索引进行查询。
在什么时候才需要建立索引呢:一般来说,在where 和jion中出现的列需要建立索引,但是也不完全如此,因为mysql只是对<,<=,=,>,>=,BETWEEN ,IN ,以及某些时候的理科才会使用索引;在以通配符%和_开头做查询时候,mysql不会使用索引。
索引的不足之处:虽然索引大大提高了查询速度,同事会降低更新表的速度,如对表进行insert、update、delete;因为更新表的时候,mysql不仅要保存数据,还要保存索引文件。
如果数据量大,且同时使用了索引,那么这个时候如果需要添加大量数据,可在凌晨时候删除索引,然后添加数据,添加完数据之后再讲联合索引加上。
6、 SQL解析顺序,SQL解析器——这部分自行百度吧
7、 数据库连接池:
数据库连接池负责分配、管理和释放数据库连接,他允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个,释放空闲时间超过最大空闲时间的数据库应该来避免因为没有释放数据库连接二引起的数据库连接遗漏,这项技术能明显提高数据库操作的性能;
原理:连接池的基本的思想实在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已经建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池,一共下一个请求访问使用。而连接的建立、断开都是有连接池自身管理的。同事还可以通过设置连接池的参数来控制连接池初始连接数、连接的上下限以及每个连接的最大使用次数、最大空闲时间等;
Java中开源的数据库连接池有一下几种:DBCP、Proxool、C3P0
C3P0比较小号资源,效率较低;
DBCP存在bug;
Proxool较好,而且提供即时监控连接池状态功能,便于发现连接池泄露的情况。
连接池、数据源、JNDI三者之间的关系:
连接池:
连接池是由容器(比如tomcat)提供的,用来管理连接池中的连接对象;
连接池自动分配连接对象并对闲置的连接进行回收;
连接池中的连接对象是由数据源(DataSource)创建的。
连接池(Connection Pool)用来管理连接(Connection)对象
数据源:
数据源(DataSource)用来连接数据库、创建连接(connection)对象;
Java.sql.DataSource接口负责建立与数据库的连接,有Tomcat提供,将连接保存在连接池中。
JDNI(Java Naming and Directory Interface,Java命名和目录接口):
在程序中使用JNDI获取数据源,通过数据源创建的连接对象呗统一的放入到连接池中进行管理
8、 线程池问题较多,也比较复杂,这里就不做解释,具体请自行百度:http://www.importnew.com/12773.html
9、 分布式框架dubbo——自行百度吧,我也没用过。。。
10、 Javasynchronize问题也自行百度吧,网上都是解答;
11、 集合类:ArrayList和linkedList的区别:
ArrayList查询时速度快,内部是用数组进行实现的,数组有下标,所以查询速度较快,增加和修改时较慢,linkedList在增加和修改时较快,查询时较慢,linkedList内部实现为链式结构,里面存储的元素收尾相连,找到前一个就可以直接找到后一个元素,所以在增加或者修改的时候可以直接修改指向下一个元素的地址,但是查询时较慢,要遍历整个list进行查询;
其中ArrayList是线程不安全的,linkedList是线程安全的。如何将两个list变成线程安全的list:
List
List
更详细部分请看:http://blog.csdn.net/hp_yangpeng/article/details/78510991
12、 服务器维护常用的指令:
top命令详解:该命令经常用来监控Linux的系统状况,比如cpu、内存的使用
第一行:
1:08:45:系统当前时间;
10 days,3:05-系统已经运行了10天3小时05分钟了(这期间没有重启过);
Load average:后面的三个参数需要经过计算,计算完毕后可以判断是否超负荷运转;
第二行:
Tasks:135 total,系统现在共有135个进程,其中有一个正在运行,134个正在休眠,0个僵尸进程(zombie:僵尸进程);
第三行:CPU的状态(共四个cpu)
0.3%us-用户空间占用CPU的百分比;
0.0%sy –内科空间占用CPU百分比;
0.0%ni-改变过优先级的进程占用的CPU百分比
0.0%wa-IO等待占用CPU百分比
0.0% hi –硬中断(Hardware IRQ)占用CPU的百分比
0.0% si-软中软(software Interrupts)占用CPU的百分比;
第四行:内存状态
3908060k total-物理内存总量(4g);
3660048k used –使用中的内存总量(3.6G)
148012k free-空闲内存总量(148M)
359760 buffers –缓存的内存量(359M)
Kill -9 杀进程:-9 是表示强制停止进程,有些时候仅使用kill,进程杀不掉;
详见:http://blog.csdn.net/hp_yangpeng/article/details/78511051
13、 Linux对某个用户线程数量的约束
查看系统支持的最大线程数量,一般很大,相当于理论值;
cat /proc/sys/kernel/pid_max----------32768
cat /proc/sys/kernel/threads –max 4132217
max_user_process #系统限制某哟用户下最多可以运行多少线程或进程,使用命令:ulimit –u
ulimit –u -----------1024
注:修改max_user_process的数值,只需要膝盖/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf
14、 Oracle 聚合查询函数:常用的聚合函数有:sum、avg、min、max、count等,其他聚合函数请自行百度吧。
15、 Java设计模式
单利模式:主要有懒汉模式、饿汉模式,
具体实现如下:
1、 懒汉模式,线程安全:
Public class singleon{
Privatestatic Singleton instance;
Priate Singleton (){}
Public static synchronized SingletongetInstance(){
If(instance==null){
Instance= new Singleton();
}
Return instance;
}
}
2、 饿汉模式,线程安全;
Public class Singleton {
Privatestatic Singleton instance = new Singleton();
Private Singleton(){}
Public static Singleton getInstance(){
Return instance
}
}
责任链模式内容较多,建议网上看视频进行学习;
16、 Redis和MQ缓存问题较多,建议自己慢慢学习(我也不会)