zoukankan      html  css  js  c++  java
  • 面试资料

    防止sql
    1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
    双"-"进行转换等。

    2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

    3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

    4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

    5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

    6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

    sql注入的几种类型:
    1.错误消息处理
    2.加密处理
    3.存储过程来执行所有的查询
    4.使用专业的漏洞扫描工具
    5.URL地址参数请求到数据库中去的,www.sample.com?testid=23


    struts1和struts2的不同
    1.struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filterDispatcher
    2.struts1的action需要继承Action类,struts2的action可以不继承任何类,struts1对同一个路径的所有请求共享一个Action实例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题。
    3.在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。
    4.与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。
    5.struts1配置文件中的redirect视图的url不能接受参数,而struts2配置文件中的redirect视图可以接受参数。


    spring AOP的作用
    1.登录注册
    2.日志记录
    3.权限管理
    4.声明式事物
    5.缓存
    6.错误处理
    7.性能优化
    8.持久化
    9.资源池
    10.异常处理


    作为中文更好理解的一个翻译应该是依赖注入,把依赖的类采用接口的方式,利用Set函数,传入Bean的内部,实现与外界的解耦合

    利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


    调用接口的方式

     

    方法重载和重写的区别

    1.重写必须继承,重载不用。
    2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
    3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
    4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常

    拦截器与过滤器的区别 :
    1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
    4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
    5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

    数据库设计三大范式
    1.第一范式(确保每列保持原子性)
    2.第二范式(确保表中的每列都和主键相关)
    3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

    REQUITES_NEW:使用自己的事物,调用的事物方法被挂起
    @Transactional(propagation=Propagation.REQUITES_NEW)
    二级缓存


    Mybatis和ibatis的区别:
    1、Mybatis实现了接口绑定,使用更加方便。
    2、对象关系映射的改进,效率更高
    3、MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。
    4.调用存储过程也不同。在 MyBatis 中,<proccedure> 元素已经被移除,通过 <select>、<insert> 和 <update> 进行定义:
    5.在 iBatis 中指定映射文件的方式<sqlMap resource=... />
    在 MyBatis 中指定映射文件的方式:
    <mappers>
    <mapper resource=... />
    <mapper resource=... />
    </mappers>
    6.配置事务管理器和数据源的方式也不同
    7. iBatis 中设置属性的方式 <settings props1="value1" props2="value2"… />
    在 MyBatis 中设置属性的方式 <settings>
    <setting name="props1" value="value1"/>
    <settings>

    8.mybatis的environment是为了多个环境之间的切换
    9.调用存储过程方式不同
    10.select元素中的parameterClass改为parameterType,resultClass改为了resultType
    11.嵌套参数由 #value# 改为了 #{value}。
    12.<parameter> 等元素的 jdbcType 属性取值中,原来的 "ORACLECURSOR" 取值改为了现在的 "CURSOR","NUMBER" 取值改为了 "NUMERIC"。


    ibatis中的#和$有何区别:
    1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错.
    2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了.
    3.#方式能够很大程度防止sql注入.
    4.$方式无法防止sql注入.
    5.$方式一般用于传入数据库对象.例如传入表名.
    6.一般能用#的就别用$.
    7.$ 的作用实际上是字符串拼接


    二级缓存的范围是当前那个文件


    索引失效的原因:
    1.字符型字段为数字时在where条件里不添加引号.
    2. 索引本身失效
    3.没有查询条件,或者查询条件没有建立索引
    4.在查询条件上没有使用引导列
    5.对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
    6.使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.
    7.like "%_" 百分号在前.
    8.not in ,not exist.


    Hibernate与Mybatis对比总结:
    两者相同点
    Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
    Hibernate和MyBatis都支持JDBC和JTA事务处理。
    Mybatis优势
    MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
    MyBatis容易掌握,而Hibernate门槛较高。
    Hibernate优势
    Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
    Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
    Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
    Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

    struts和spring MVC的区别:
    1.springMVC全注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样使用)。
    2.Struts2中自身提供多种参数接受,其实都是通过(ValueStack)进行传递和赋值,而SpringMvc是通过方法的参数进行接收。
    3.Struts更加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,springmvc 比较简单,很较少的时间都能上手。
    4.spring mvc是方法级别的拦截,一个方法对应一个request上下文; struts2是类级别的拦截,一个类对应一个request上下文;
    5.spring mvc处理ajax请求,直接通过返回数据, 方法中 使用注解 @ResponseBody, spring mvc自动帮我们对象转换为JSON数据。


    拦截器和过滤器的区别:
    1.Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
    2.Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
    3.Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
    4.Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤
    5.interceptor的拦截处理其实就是代理机制!


    性能优化技巧:
    1.建立索引,存储过程,触发器和视图
    2.在查询的时候避免使用×
    3.避免使用子查询
    4.应当理解exists和in之间的区别,union和or之间的区别


    数据库设计的三大范式:
    1.第一范式(确保每列保持原子性)
    2. 确保每列都是与主键直接有关
    3. 确保每列都是与主键直接有关,而不是间接有关


    get和post的区别:
    1.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
    2.get传送的数据量较小,不能大于2KB。post传送的数据量较大
    3.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到
    4.在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;


    随着数据库的日渐庞大,有时需要进行归档。以下是一些思路:
    1.新建一个表空间存放各表的历史数据。
    1.1写一个存储过程搬数据,数据搬迁到历史表后,在基表中将搬迁的数据删除。
    2.定期将历史数据exp到磁带中去做永久保存。
    3.历史数据exp之后,可以清空各历史数据表。这样,表空间的大小实际上是很容易伸缩及控制的。


    sql优化:
    1.关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加% ,若要提高效率,可以考虑全文检索。
    2.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
    3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
    select id from t where num is null
    4.最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.
    5.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
    6.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
    select id from t where num=10 or Name = 'admin'
    可以这样查询:select id from t where num = 10
    union all
    select id from t where Name = 'admin'
    7.in 和 not in 也要慎用,否则会导致全表扫描,如:
    select id from t where num in(1,2,37)
    8.对于连续的数值,能用 between 就不要用 in 了:
    select id from t where num between 1 and 3
    9.很多时候用 exists 代替 in 是一个好的选择:
    select num from a where num in(select num from b)
    用下面的语句替换:
    select num from a where exists(select 1 from b where num=a.num)
    10.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
    select id from t where num/2 = 100 改为 select id from t where num = 100*2
    11.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
    select id from t where substring(name,1,3) = ’abc’ -–name以abc开头的id
    select id from t where datediff(day,createdate,’2005-11-30′) = 0 -–‘2005-11-30’
    12.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。
    13.一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。


    14.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。


    java接口的作用:每个类中都需要一些同名且返回值一样的方法,这时候就可以用接口,把这些方法全部写在一个接口中,
    让这10个类去实现,这样10个类中就有了这些方法`只需要自己具体的去填写方法内部了

    数据库设计的三大范式:

    1.第一范式(确保每列保持原子性)

    2.第二范式(确保表中的每列都和主键相关)

    3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

  • 相关阅读:
    KETTLE集群搭建
    初识spark
    利用python操作mrjob实例---wordcount
    hive 优化 (转)
    hive权限管理
    hadoop常用操作命令
    hive的分桶
    Hive HQL基本操作
    hadoop--hive数据仓库
    Hive配置项的含义详解
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/4951692.html
Copyright © 2011-2022 走看看