Hibernate
- Hibernate中的get和load的区别
1.从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常;
get方法检索不到的话会返回null;
2.从检索执行机制上对比
Load:1.查询session缓存:先查一下session缓存,看看该id对应的对象是否存在
缓存中没有这个对象 就创建个代理。因为延迟加载需要代理来执行 所以就创建了个代理,ok 到此为止 这句话就执行完了,这个 并没有去数据库交互查询,总之真正操作使用数据的时候,对象才存在到内存,节省了服务器内存的开销,从而提高了服务器的性能。
Get:hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
- MyBatis和Hibernate的优缺点对比。
Hibernate的优点:
- 对jdbc进行了封装,去掉了一些重复性的代码
- 与数据库的无关性好,映射关系强,自动生成sql语句,开发速度快。
- Hibernate的移植性好(体现在换数据库的情况下)
缺点:
- 学习成本高,在配置表与表之间的映射关系复杂,在性能优化设计上需要经验
- Hql语句查询有局限,没有sql语句灵活(例如投影查询)
Mybatis的优点:
- 易于上手和掌握,sql语句灵活
- Sql语句都在xml文件内,实现了sql与代码的解耦合
- 在性能上相对于hibernate来说,速度比它快
缺点:
1、关联表多时,字段多的时候,sql工作量很大。
2、sql依赖于数据库,导致数据库移植性差。
Struts2
Spring
Spring的优点
- 使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
- AOP的很好支持,方便面向切面编程。
- 可以容纳各种优秀的框架,最主要原因
- 对于代码基本是零污染
谈谈你对spring的理解
Spring是一个优秀的简化企业级应用的开源框架,然后说出spring的优点
然后分别介绍IOC,DI,AOP
SpringMVC的流程
- 用户请求发送到前端控制器(dispatchServlet)
- 前端控制器没有处理业务逻辑能力,分配到handler的映射器(判断是否注解)
- 然后会走到handleradopt的适配器,返回执行链携带了两部分内容:handler对象,拦截器处理包装后的handler对象
- 然后经过处理器处理业务逻辑,返回ModelAndView对象
- 将ModelAndView返回前端控制器
- 然后经过视频解析器,进行视图渲染,返回视图
- 经过tomcat将其换边为html返回
- 用户产生响应
编程式事务与声明式事务的区别?
编程式事务是自己写事务处理的类,然后调用
声明式事务是在配置文件中配置,一般在框架里面使用,做到代码不污染,零浸入
其他知识点:
Jsp的九大内置对象
1、page对象
2、pageContext对象
3、request对象
4、session对象
5、application对象那个
6、response对象
7、config对象
8、out对象
9、exception对象
Jsp参数传递的方式:
- form表单
- Request.setAttribute()和Request.getAttribute()
- <jsp:param>
- 超链接
JS实现点击事件
<button id =”btn”>click</button>
Var btn = document.getElementById(“btn”)
Btn.onclick=function(){
Alert(“hello word”)
}
Jsp页面表单重复提交问题
- js禁掉提交按钮
- 尽量使用get/post/redirect方式提交
- 在form表单上使用cache-control,去掉表单上的缓存
Cookie和session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、session能够存储任意java对象,cookie只能存储String对象
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
Servlet和Jsp的区别
Jsp的本质就是一个servlet,jsp在运行时,就会被编译成servlet文件。
Jsp更擅长网页制作,显示,修改后可以直接在页面上看到
Servlet更擅长业务逻辑处理编程。
Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
forward与redirect的区别是什么?
Forward是请求转发,特点为:一次请求,只能访问内部资源,在传输过程中数据不会丢失,地址栏不会改变
应用:一般用户用户登录时,根据角色转发到响应的模块
效率:高
Redirect是重定向,特点为:两次请求,可以访问任意资源,地址栏会发生变化,在传输过程中数据会丢失
应用:一般用于用户注销登录时返回主页或跳转到其他网站
效率:低
sleep和wait的区别
- 这两个方法来自不同的类分别是Thread和Object
- 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
你所接触的开源框架有哪些?
shiro安全框架,activemq消息中间件,dubbo分布式框架,redis,quartz等等。
长连接和短连接
通常的短连接操作步骤是: 连接→数据传输→关闭连接;
长连接通常就是: 连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
长连接多用于操作频繁,点对点的通讯,且连接数不能太多的情况;
数据库一般使用长连接,http请求多用于短连接。
粗粒度与细粒度权限的区别?
粗粒度权限管理,对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。。
粗粒度权限管理比如:超级管理员可以访问户添加页面、用户信息等全部页面。
部门管理员可以访问用户信息页面包括 页面中所有按钮。
细粒度权限管理,对资源实例的权限管理。资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息、行政部的员工。
细粒度权限管理就是数据级别的权限管理。
细粒度权限管理比如:部门经理只可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。。
粗粒度和细粒度例子:
系统有一个用户列表查询页面,对用户列表查询分权限,如果粗颗粒管理,张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。
进一步进行细颗粒管理,张三(行政部)和李四(开发部)只可以查询自己本部门的用户信息。张三只能查看行政部 的用户信息,李四只能查看开发部门的用户信息。细粒度权限管理就是数据级别的权限管理。
单例模式的手写/冒泡排序
常见的异常有哪些
Indexoutofbounce 索引越界异常
java.lang.NullPointerException(空指针异常)
Classnotfoundexception 找不到类
java.lang.NumberFormatException 字符串转换数字异常
Classcastexception 数据类型转换异常
Filenotfoundexception 文件未找到
java.lang.NoSuchMethodException 方法不存在
内存泄漏
内存泄漏就是我们用完一块内存后给弄丢了,导致垃圾回收器不能对其回收,所以导致内存泄漏,内存泄漏堆积过多,就会导致内存溢出
Ajax的原理及实现步骤:
Ajax相当于一个中间件,调用xmlHttpRequest对象,优化了浏览器与服务器之间的传输,减少了不必要的数据往返,相当于减轻了服务器的压力
原理: HTTP协议的异步通信
get 请求
1) 创建一个XMLHttpRequest对象
2) 调用该对象的open方法
3) 如果是get请求,设置回调函数onreadystatechange = callback
4) Send
如果是post 请求
创建一个XMLHttpRequest对象
6) 调用该对象的open方法
7) 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
8) 设置回调函数onreadystatechange = callback
9) Send
MVC设计模式及各个功能
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图):是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
属于线程私有的内存空间是?
程序计数器,虚拟机栈,本地方法栈
Redis
redis的五种数据结构
1、String类型。Value只能是String类型。
2、Hash类型。可以对key进行分类。
3、List类型。所有元素是有序的
4、Set类型。元素是无序的,元素是不能重复。集合操作,并集,交集,差集
5、SortedSet(zset)有序的set,元素不能重复且有序。
String—字符串
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,一个键最大能存储512MB。
使用场景:原子计数器,页面缓存
Hash——字典(哈希)
Hash是一个健值对集合,是一个String类型的key与value的映射表,特别适合用于存储对象。
使用场景:存储、读取、修改用户属性
List——列表
使用场景:微博 TimeLine、消息队列
Set——集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
使用场景:1.共同好友、二度好友 2.利用唯一性,可以统计访问网站的所有独立 IP 3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
Sorted Set——有序集合
使用场景:1.带有权重的元素,比如一个游戏的用户得分排行榜 2.比较复杂的数据结构,一般用到的场景不算太多
redis常用的操作命令
get/set
keys *
expir/ttl 设置保存多长时间/查看还有多长时间
incr/decr 自增和自减
del 删除
redis的集群安装步骤:
1、需要干净的6个redis实例
2、修改6个实例的端口号 port
3、修改6个实例的集群属性 cluster-entable yes 开启
4、安装ruby的环境和rubygem系统,redis-3.0.2.gem接口包
5、在redis安装包下redis-3.0.2/src/redis-trib.rb文件运行:
./redis-trib.rb create --replicas 1 192.168.37.161:7001 192.168.37.161:7002 192.168.37.161:7003 192.168.37.161:7004 192.168.37.161:7005 192.168.37.161:7006
redis是单线程,但是Redis的读写速度太快了。
Redis特点:
读写速度快,安全性差,不能存储海量数据
redis安全性高吗?
面试题:
redis的持久化:
RDB :
save 900 1 : 900 秒 更新一次 保存
save 300 10 : 300秒 更新10次保存
save 60 10000 : 60秒 更新10000次给你保存
最好的情况:能保存60秒的数据!!!
正好 : 59秒 断电了!
AOF :
保存磁盘并且保存的命令!
# appendfsync always : 实时保存
appendfsync everysec : 一秒钟保存: 900毫秒的时候断电了!
# appendfsync no
最好的请求能保留:1秒钟的数据!!!
数据库相关(Mysql和oracle)
Oracle:
oracle中,在查询语句中将null变成0,如何处理?
Select nvl(null,0) from dual;
oracel中是如何进行分页查询的?
select * from student where rownum>=1;
--如果想要用rownum不从1开始,
Select a1.* from (select student.*,rownum rn from student) a1 where rn > 5;
--在3-5之间的
select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;
select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;
char和varchar的区别
char:(存储效率和索引效率极高)
使用指定长度的固定长度表示的字符串;比如char(8),则数据库会使用固定的8个字节来存储数据,不管你够不够8个字节,都会给你开辟8个空间
Varchar:
存储变长数据,根据你所需要的字节数给你开辟空间,比如不够8个字节的话,他就会给你开辟符合你的字节数。
数据库索引的作用优点和缺点
优点:
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
Mysql
Mysql的优化
表结构优化方面:
- 尽量把字段设置成not null,避免数据库做一些null判断
- 尽量使用英文代替中文
- 尽量使用数字代替一些非必要的字段,例如sex
- 在varchar()尽量设置空间,避免数据库对容量做一些判断
- 尽量使用varchar代替char
- 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
- 避免频繁创建和删除临时表,以减少系统表资源的消耗。
Sql语句优化方面:
- 使用join代替子查询
b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
2、使用联合(UNION)来代替手动创建的临时表或者代替or
创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
3、建立索引
(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
4、优化sql语句
- 在使用limit查询时,如果基数过于庞大,使用between...and...替换
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
- 使用not extit 代替not in
- 开启查询缓存,优化查询。
- 正确的选择引擎。
- 后台使用prepareStatement,安全防注入,性能高
- 垂直分表
- 使用 ENUM 而不是 VARCHAR,如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是VARCHAR。
- explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的
java方面:重点内容:
a.尽可能的少造对象。
b.合理摆正系统设计的位置。大量数据操作,和少量数据操作一定是分开的。大量的数据操作,肯定不是ORM框架搞定的。,
c.使用jDBC链接数据库操作数据
d.控制好内存,让数据流起来,而不是全部读到内存再处理,而是边读取边处理;
e.合理利用内存,有的数据要缓存
Mysql分表
水平分表:把一个表拆分按某个字段拆分称多个表 (用户表)
垂直分表:把表的大字段,并且不是经常查询,单独的放入到一张表去(文章表)
水平分库方式主要根据用户属性(如地市)拆分物理数据库。(一种常见的方式是将全省划分为几个大区)
垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。(收藏夹和博客的库分开)
Mysql 中 MyISAM 和 InnoDB 的区别有哪些?
区别:
1、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2、InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
3、InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4、InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
Mysql的存储过程
Create procedure pr_add(a int,b int)
Begin
Decare c int;
If a is null then set a = 0;
End if;
If b is null then set b = 0;
End if;
Set c = a + b;
Select c as sum;
Volatile关键字:回答思路
- 先解释一下内存模型:并简单说明一个每个的作用
- 然后说volatile的两个特点:可见性,非原子性(有bug)
- 解释bug原因:由于是实时更新,在还没执行时就已经更新了
volatile static int start = 3;
volatile static int end = 6;
线程A执行如下代码:
while (start < end){
//do something
}
线程B执行如下代码:
start+=3;
end+=3;
这种情况下,一旦在线程A的循环中执行了线程B,start有可能先更新成6,造成了一瞬间 start == end,从而跳出while循环的可能性。
- 使用场景
运行结果并不依赖变量的当前值
变量不需要与其他的状态变量共同参与不变约束。